2

OpenGLでは、マルチパスレンダリングと後処理を行うときに、フルスクリーンテクスチャコンポジションの一部であるプリミティブのアセンブリフラグメントにテクセルを適用する必要がある場合があります。これは通常、現在のパスが画面のFBOテクスチャからのものである場合です。クワッドは前のパスでレンダリングされていました。これを実現するために、画面スペースでオブジェクトのUV座標を計算します。GLSLでは、次のように計算します。

     vec2 texelSize = 1.0 / vec2(textureSize(TEXTURE, 0));
 vec2 screenTexCoords = gl_FragCoord.xy * texelSize;

現在、CG / HLSLを使用するUnity3Dを試しています、これらの言語のドキュメントは不十分です。CG/ HLSLで画面のUV座標を計算するにはどうすればよいですか?

4

1 に答える 1

3

スクリーン texcoords を計算するには、通常、スクリーン解像度またはその逆数 (resまたはrcpres) をシェーダーに渡し、それらによって変更されたフルスクリーン クワッド ( の範囲を想定) の texcoords を使用します[0,1]

編集:多くの場合、両方が必要であり、利用可能であることに注意してresくださいrcpres。現在の位置を計算するのに役立ちます (除算が必要になるため、そのためにはres使用しません) が、CPU で 1 回計算でき、1 つのテクセル分移動するのに役立ちます (原点からもう 1 つのテクセルです)。 )。rcpresrcpres(res * uv) + rcpres)

何かのようなもの:

float2 res; // contains the screen res, ie {640, 480}

void postEffect(in float2 uv : TEXCOORD, ...)
{
    float2 pos = uv * res; // pos now contains your current position

fs クワッドからの座標は texel と texel にあるという論理である0,0ため0,0、次元が1,1わかれmaxX,maxYば乗算できます。

ただし、各エフェクトに値を提供する必要がありますがres、これはシェーダー システムによって異なります (Unity3D では既に提供されている場合があります)。

于 2013-01-07T22:17:12.177 に答える