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

~19h ago

motzi: @udo2013: you can't change the resolution of the standard DX11 renderer (res=window size). use temptarget renderer + preview instead

~23h ago

Tamoeba Kale: Is it possible that i am missing thew whole "animation" category nodes? how?

~2d ago

udo2013: hello. is there a way to change the fullscreen resolution of renderer dx11? found no possibility + can not be opened.

~2d ago

tekcor: @joreg vl.glTF loader looks intense inside, but is red in b36.

~2d ago

MultiNIL: @joreg sure!

~3d ago

joreg: @MultiNIL supa! can we have this as a gallery entry? 24

~3d ago

MultiNIL: forgot to share: our very first vvvv project, digital-hybrid-airhockey-table: https://vimeo.com/210617286 making of: https://vimeo.com/269974764

~3d ago

dawoof: looking for a VJ/performer for the 1st of june for 1 hour in Amsterdam for a Conference, Hit me up +649241940

~3d ago

tekcor: @joreg cool seems like i missed that one. such a good shader resource

~4d ago

karistouf: does anyone has trouble with the new update of windows ? switching to other app while rendering fullscreen provoks blank output