2013-03-01 10 views
6

シェイダーでTHREE.jsを使用しています。私はzbufferの情報を取得しようとしています。gl_FragCoord.x、y、zはすべてのピクセルで1、wは奥行きです

バーテックスシェーダ:

// 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); 
} 

シーン内の異なる位置を有するオブジェクトは、このようにZバッファの値が変化しなければならない、があります。

それはgl_FragCoord.wが異なるフラグメントのために変化するように思わながらgl_FragCoord.xgl_FragCoord.ygl_FragCoord.zは、すべての断片について1.0のようだという奇妙です。

私が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); 
} 

をZバッファの画像のようだ:

enter image description here

gl_FragCoord.zは常にすべての断片について1.0ありながら、なぜgl_FragCoord.w奥行き情報を表すことでしょうか?

答えて

14

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

gl_FragCoord.zはおそらく1.0ではありませんが、奥行きの範囲やカメラからのオブジェクトの距離によっては十分に近いかもしれません。深さを実際に知りたい場合は、linearize itが必要です。

+1

シェーダで画面の幅と高さを取得するにはどうすればよいですか? – Ovilia

+0

@Ovilia:他の値と同じように:ユニフォームで。 –

+0

しかし、なぜ 'gl_FragCoord.w'は異なるフラグメントで変化しますか? – Ovilia

関連する問題