8

シェーダーで THREE.js を使用しています。zbuffer 情報を取得しようとしています。

頂点シェーダー:

// switch on high precision floats
#ifdef GL_ES
precision highp float;
#endif

void main()
{
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}

フラグメント シェーダー:

#ifdef GL_ES
precision highp float;
#endif

void main()
{
    gl_FragColor = vec4(gl_FragCoord.x, gl_FragCoord.y, gl_FragCoord.z, 1.0);
}

シーン内の位置が異なるオブジェクトがあるため、zbuffer の値は異なるはずです。

とがすべてのフラグメントに当てはまるように見えるのにgl_FragCoord.x、フラグメントごとに異なるように見えるのは奇妙です。gl_FragCoord.ygl_FragCoord.z1.0gl_FragCoord.w

私が使用する場合gl_FragCoord.w

#ifdef GL_ES
precision highp float;
#endif

void main()
{
    float zbuffer = gl_FragCoord.w * 500.0;
    gl_FragColor = vec4(zbuffer, zbuffer, zbuffer, 1.0);
}

zbuffer イメージのようです:

ここに画像の説明を入力

では、常にすべてのフラグメントgl_FragCoord.wに対して が深度情報を表しているのはなぜでしょうか?gl_FragCoord.z1.0

4

1 に答える 1

16

gl_FragCoordウィンドウスペースにあります。また、ウィンドウスペースはウィンドウのピクセル座標です。したがって、事実上すべてのフラグメントの値は1.0を超えます。また、浮動小数点フレームバッファにレンダリングしていないことはほぼ確実なので、色は[0、1]の範囲にクランプされます。

gl_FragCoord.zおそらく1.0ではありませんが、深度範囲とオブジェクトがカメラからどれだけ離れているかによっては、1.0に十分近い場合があります。深さの実際のアイデアを取得したい場合は、それを線形化する必要があります。

于 2013-03-01T05:32:51.827 に答える