glsl – gl_FragCoord.x,y,z为所有像素为1,w为深度

前端之家收集整理的这篇文章主要介绍了glsl – gl_FragCoord.x,y,z为所有像素为1,w为深度前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用着色器使用THREE.js.我正在尝试获取zbuffer信息.

顶点着色器:

  1. // switch on high precision floats
  2. #ifdef GL_ES
  3. precision highp float;
  4. #endif
  5.  
  6. void main()
  7. {
  8. gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);
  9. }

片段着色器:

  1. #ifdef GL_ES
  2. precision highp float;
  3. #endif
  4.  
  5. void main()
  6. {
  7. gl_FragColor = vec4(gl_FragCoord.x,gl_FragCoord.y,gl_FragCoord.z,1.0);
  8. }

场景中有不同位置的对象,因此zbuffer中的值应该有所不同.

奇怪的是,对于所有片段,gl_FragCoord.x,gl_FragCoord.y和gl_FragCoord.z似乎都是1.0,而gl_FragCoord.w似乎因不同的片段而异.

如果我使用gl_FragCoord.w:

  1. #ifdef GL_ES
  2. precision highp float;
  3. #endif
  4.  
  5. void main()
  6. {
  7. float zbuffer = gl_FragCoord.w * 500.0;
  8. gl_FragColor = vec4(zbuffer,zbuffer,1.0);
  9. }

它似乎是zbuffer图像:

那么为什么gl_FragCoord.w会表示深度信息,而gl_FragCoord.z对于所有片段总是1.0?

解决方法

gl_FragCoord在窗口空间中.并且 window space在窗口的像素坐标中.因此,几乎所有碎片都具有值> 1.0.由于您几乎肯定不会渲染到浮点帧缓冲区,因此您的颜色将被限制在[0,1]范围内.

gl_FragCoord.z可能不是1.0,但它可能足够接近它,具体取决于您的深度范围以及物体离相机的距离.如果你想深入了解深度,你需要linearize it.

猜你在找的JavaScript相关文章