» チュートリアル エフェクト - マルチパス
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

~16h ago

joreg: Workshop on 09 05: Deepdive into the Stride 3D Engine. Signup here: https://thenodeinstitute.org/courses/ss24-vvvv-advanced-3d-rendering-in-vvvv-with-stride/

~17h ago

tekcor: Dear vvvv community, I am leaving my personal fundraiser here because I know many of you personally, sending love https://t.ly/iV9l_

~2d ago

joreg: Rewatch the 24th vvvvorldwide meetup here: https://www.youtube.com/live/gNszIiRAjDo?si=0RXF0pW73EUaRqGk

~2d ago

joreg: LINK - the vvvv summer camp 2024 is announced: https://visualprogramming.net/blog/2024/link-the-vvvv-summer-camp-24/

~4d ago

joreg: Tonight, May 3, vvvv meetup in Berlin or via stream: https://visualprogramming.net/blog/2024/24.-vvvv-worldwide-meetup/

~7d ago

joreg: Workshop on 02 05: Intro to the Stride 3D Engine. Signup here: https://thenodeinstitute.org/courses/ss24-vvvv-intro-to-the-stride-3d-engine-in-vvvv/

~8d ago

joreg: The new vvvv Show-Off-Reel is out: https://vimeo.com/930568091

~14d ago

joreg: The summer season of vvvv workshops at The NODE Institute is out: https://thenodeinstitute.org/ss24-vvvv-intermediates/