TOC: エフェクトとシェーダー
Back: マルチテクスチャ
Next: 頂点シェーダーの準備
近傍ピクセル で約束した通り、水平と垂直の両方の方向で完璧になめらかなブラーを得る連鎖の仕方があります。
RendererPass 1の出力はテクスチャとなり、元画像の解像度に相当します。このテクスチャはPass 2で垂直方向のブラーエフェクトの入力として使われます。この様にしていくつのエフェクトでも連鎖することができます。
このテクニックを使えばもちろんテクスチャの入力を通して作成された出力を使うことが出来ます。したがってフィードバックを引き起こすエフェクトを作成することもできます。
その様なアプリケーションの例はセル・オートマトン であり、ジョン・ホートン・コンウェイの"ライフゲーム"は最もポピュラーなものです。
ゲームというよりはむしろ実際は死(黒)か生(白)のどちらかになるというセル(テクスチャのピクセルの様な)のグリッドに基づくシミュレーションです。シミュレーション結果は基本的にいくつかの白いピクセルを伴った黒いテクスチャになります。シミュレーションの次の生成のための始まりの点として結果を使うことでフィードバックを引き起こし、永久にシミュレーションを実行します。もちろん、開始するための初期状態は必要で、この例ではマウスを使い生きているセルを追加しています。of-effects-and-shadersのパッチを参考にしてください。
ライフゲームは3つの簡単なルールがあります:
だからピクセルシェーダーでは、すべてのピクセルについて生きている隣のセルを数え、ルールに従って次の生成でピクセルが生きるか死ぬか決める必要があります。
float2 PixelSize; float4 PS(vs2ps In): COLOR { //sample the current pixel float4 center = tex2D(Samp, In.TexCd); //prepare pixel offsets for x and y float2 offX = float2 (PixelSize.x, 0); float2 offY = float2 (0, PixelSize.y); //sample neighbours and add up their states float alive = 0; alive += tex2D(Samp, In.TexCd - offY).r; alive += tex2D(Samp, In.TexCd - offY - offX).r; alive += tex2D(Samp, In.TexCd - offY + offX).r; alive += tex2D(Samp, In.TexCd + offY).r; alive += tex2D(Samp, In.TexCd + offY - offX).r; alive += tex2D(Samp, In.TexCd + offY + offX).r; alive += tex2D(Samp, In.TexCd - offX).r; alive += tex2D(Samp, In.TexCd + offX).r; //a dead cell with exactly three live neighbors becomes a live cell (birth). if (center.r == 0 && alive == 3) { center.rgb = 1; } //a live cell with two or three live neighbors stays alive (survival). else if (center.r == 1 && (alive == 3 || alive == 2)) { center.rgb = 1; } //in all other cases, a cell dies or remains dead (overcrowding or loneliness). else { center.rgb = 0; } return center; }
エフェクト内で、その他の注意すべき重要な事柄にサンプラーステートの設定があります:
sampler Samp = sampler_state //sampler for doing the texture-lookup { Texture = (Tex); //apply a texture to the sampler MipFilter = NONE; //sampler states MinFilter = POINT; MagFilter = POINT; };
全てのフィルタリングは使用できないことを気に留めてください。
固有のピクセルで正確に動作し、ピクセルが黒か白だけにはなりますがグレーには変化しないこのアプリケーションでは意味をなさないの
で、グラフィックカードにピクセル間の補間をさせてはいけません。
anonymous user login
~2d ago
~2d ago
~10d ago
~12d ago
~13d ago
~17d ago
~17d ago
~24d ago
~1mth ago
~1mth ago