» チュートリアル エフェクト - マルチパス
This site relies heavily on Javascript. You should enable it if you want the full experience. Learn more.

チュートリアル エフェクト - マルチパス

English | Italian | Mandarin

TOC: エフェクトとシェーダー
Back: マルチテクスチャ
Next: 頂点シェーダーの準備


EX9.Effect.Fileで概要を述べている様にtechnique毎にマルチパスを持つことが出来るものの、(vvvvでは)pass2内でpass1のピクセルシェーダーで返された色にアクセスする方法はありません。そのようなマルチパスエフェクトに対してはRenderer (EX9)を迂回する必要があり、DXTexture (EX9.Texture) を通してテクスチャとして出力されたものを他のエフェクトの入力として使います。

エフェクトチェイン

近傍ピクセル で約束した通り、水平と垂直の両方の方向で完璧になめらかなブラーを得る連鎖の仕方があります。

RendererPass 1の出力はテクスチャとなり、元画像の解像度に相当します。このテクスチャはPass 2で垂直方向のブラーエフェクトの入力として使われます。この様にしていくつのエフェクトでも連鎖することができます。

フィードバック

このテクニックを使えばもちろんテクスチャの入力を通して作成された出力を使うことが出来ます。したがってフィードバックを引き起こすエフェクトを作成することもできます。

その様なアプリケーションの例はセル・オートマトン であり、ジョン・ホートン・コンウェイの"ライフゲーム"は最もポピュラーなものです。

ゲームというよりはむしろ実際は死(黒)か生(白)のどちらかになるというセル(テクスチャのピクセルの様な)のグリッドに基づくシミュレーションです。シミュレーション結果は基本的にいくつかの白いピクセルを伴った黒いテクスチャになります。シミュレーションの次の生成のための始まりの点として結果を使うことでフィードバックを引き起こし、永久にシミュレーションを実行します。もちろん、開始するための初期状態は必要で、この例ではマウスを使い生きているセルを追加しています。of-effects-and-shadersのパッチを参考にしてください。

ライフゲームは3つの簡単なルールがあります:

  • 3つの生きているセルを隣に持つ死んでいるセルは生きているセルになる(誕生)。
  • 2つまたは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;
};

全てのフィルタリングは使用できないことを気に留めてください。
固有のピクセルで正確に動作し、ピクセルが黒か白だけにはなりますがグレーには変化しないこのアプリケーションでは意味をなさないの
で、グラフィックカードにピクセル間の補間をさせてはいけません。


Next: 頂点シェーダーの準備
Back: マルチテクスチャ
TOC: エフェクトとシェーダー

anonymous user login

Shoutbox

~3d ago

joreg: vvvvTv S02E01 is out: Buttons & Sliders with Dear ImGui: https://www.youtube.com/live/PuuTilbqd9w

~9d ago

joreg: vvvvTv S02E00 is out: Sensors & Servos with Arduino: https://visualprogramming.net/blog/2024/vvvvtv-is-back-with-season-2/

~10d ago

fleg: hey there! What's the best tool for remote work? Teamviewer feels terrible. Thanks!

~23d ago

joreg: Last call: 6-session vvvv beginner course starting November 4: https://thenodeinstitute.org/courses/ws24-5-vvvv-beginners-part-i/

~1mth ago

joreg: Missed the last meetup? You can rewatch it here: https://www.youtube.com/live/MdvTa58uxB0?si=Fwi-9hHoCmo794Ag

~1mth ago

theurbankind: When is the next big event, like node festival ?

~1mth ago

~1mth ago

joreg: Join us for the next vvvv meetup on Oktober 17th: https://visualprogramming.net/blog/2024/25.-vvvv-worldwide-meetup/

~2mth ago

joreg: 6 session beginner course part 2 "Deep Dive" starts January 13th: https://thenodeinstitute.org/courses/ws24-5-vvvv-beginners-part-ii/