2017-04-18 12 views
2

this shadertoy sceneMetal Kernelに翻訳しようとしました。 shadertoyコードで:メタルシェーディング言語 - FragCoord相当ですか?

void mainImage(out vec4 fragColor, in vec2 fragCoord) 
{ 
    vec3 dir = rayDirection(45.0, iResolution.xy, fragCoord); 
    ... 
} 

場合OpenGLでは、我々はglfw窓からiResolutionを送信する必要があります。 fragCoordgl_FragCoordからFragment Shaderになります。

私はmetalファイルでこれを持っている:だから私はwidthheightから私のiResolutionを得ることができます

kernel void compute(texture2d<float, access::write> output [[texture(0)]], 
        uint2 gid [[thread_position_in_grid]]) { 
    int width = output.get_width(); 
    int height = output.get_height(); 
    .... 
} 

。しかし、私はgl_FragCoordを得る方法がわかりません。

Do Metal_stdlibには、gl_FragCoordと同等のものがありますか?または、計算しなければならない場合、どうすれば同じ価値を得ることができますか?

+0

出力テクスチャとまったく同じサイズの単一のグリッドをディスパッチした場合、 'gl_FragCoord'に相当するものは' float2(gid)/ float2(width、height) 'です。 – warrenm

+0

また、これは、計算関数ではなく、レンダリングパスでの実際のフラグメント関数の方が良いかもしれないようです。その場合、フラグメント座標は '[[position]]'でマークされた入力変数または 'stage_in'構造体フィールドになります。 –

+0

@warrenmどのようにコードを実行するのですか?私の画面解像度が浮動小数点(800/600)であるとしましょう、どのように私は 'スレッドグループ'または 'スレッドグループ数'を分割するのですか? – sooon

答えて

1

ウィンドウ座標(「gl_FragCoord」)の「フラグメント」位置を検索する場合は、float2(gid)を使用できます。範囲は(0,0)〜(幅、高さ)です。これはグリッドディメンション(スレッドグループサイズとスレッドグループカウントの積)がデスティネーションテクスチャのディメンションと正確に一致する場合にのみ当てはまります。

関連する問題