2013-03-01 22 views
6

Tôi đang sử dụng THREE.js với trình đổ bóng. Tôi đang cố gắng để có được thông tin zbuffer.gl_FragCoord.x, y, z là 1 cho tất cả các pixel và w là độ sâu

Vertex Shader:

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

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

Fragment Shader:

#ifdef GL_ES 
precision highp float; 
#endif 

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

Có đối tượng với vị trí khác nhau trong hiện trường, do đó các giá trị trong zbuffer nên khác nhau.

Đó là lạ mà gl_FragCoord.x, gl_FragCoord.ygl_FragCoord.z có vẻ là 1.0 cho tất cả các mảnh vỡ, trong khi gl_FragCoord.w dường như thay đổi đối với các mảnh khác nhau.

Nếu tôi sử dụng 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); 
} 

Nó có vẻ là hình ảnh zbuffer:

enter image description here

Vậy tại sao sẽ gl_FragCoord.w được đại diện thông tin chiều sâu trong khi gl_FragCoord.z luôn là 1.0 cho tất cả các mảnh vỡ?

Trả lời

14

gl_FragCoord nằm trong không gian cửa sổ. Và window space nằm trong tọa độ pixel của cửa sổ. Vì vậy, hầu như tất cả các mảnh của bạn sẽ có giá trị> 1.0. Và vì bạn gần như chắc chắn không hiển thị cho một bộ đệm khung hình nổi, các màu của bạn sẽ được kẹp vào phạm vi [0, 1].

gl_FragCoord.z có lẽ không phải là 1.0, nhưng nó có thể đủ gần, tùy thuộc vào độ sâu của bạn và khoảng cách giữa các đối tượng từ máy ảnh. Nếu bạn muốn có được một ý tưởng thực sự về chiều sâu, bạn cần phải linearize it.

+1

Làm cách nào để có được chiều rộng và chiều cao màn hình trong trình đổ bóng? – Ovilia

+0

@Ovilia: Cũng giống như cách bạn thực hiện bất kỳ giá trị nào khác: với đồng phục. –

+0

Nhưng tại sao 'gl_FragCoord.w' lại khác nhau đối với các đoạn khác nhau? – Ovilia

Các vấn đề liên quan