2013-03-01 4 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); 
} 

조각 쉐이더 :

따라서 z 버퍼의 값이 변화해야하는 장면에서 서로 다른 위치에 객체가있다
#ifdef GL_ES 
precision highp float; 
#endif 

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

. gl_FragCoord.w 다른 조각에 따라 다를 것 같다 동안

그것은 gl_FragCoord.x, gl_FragCoord.ygl_FragCoord.z 모든 조각에 대한 1.0 것 같다 이상하다.

내가 gl_FragCoord.w를 사용하는 경우 : gl_FragCoord.z는 항상 모든 조각에 대한 1.0 동안

enter image description here

가 왜 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 버퍼 이미지 것 같다?

답변

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