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

~27d ago

joreg: Summer Season 23 vvvv workshops are now ready for sign-up: https://thenodeinstitute.org/vvvv-intermediates-summer-2023/

~30d ago

schlonzo: yeah! shader input pins now also visible, while the variable it not used!

~1mth ago

benju: Job opportunity, teaching Sounddesign for New Media purposes in Berlin (6hrs/week): https://www.letteverein.berlin/wp-content/uploads/2023/03/Ausschreibung_MIA_LK_6_UStd._Sounddesign_NEU.pdf

~1mth ago

joreg: vvvv gamma 5.0 is out! Please read all about it in the release notes: https://visualprogramming.net/blog/2023/vvvv-gamma-5.0-release

~2mth ago

domj: Coming to LPM next weekend? Learn more about one of the first full vvvv gamma apps, Schéma! https://liveperformersmeeting.net/editions/2023-muenster/program/detail/schema-talk/

~2mth ago

joreg: Want to get started with #vvvv? Check this 12 session beginner online course starting May 8th: https://thenodeinstitute.org/courses/vvvv-beginner-class-summer-2023/

~3mth ago

mediadog: @ggml Yup, lots. Only used in 4.x, haven't tried in 5.x yet: https://www.unrealengine.com/marketplace/en-US/product/simple-udp-tcp-socket-client

~3mth ago

ggml: someone has sent udp bytes to unreal ?