渲染深度缓冲区到纹理

时间:2011-12-10 21:22:56

标签: opengl-es textures shader depth-buffer

着色器相当新,所以如果我在这里做些傻话,请耐心等待。 :)

我正在尝试使用iOS上的opengl ES 2.0将场景的深度缓冲区渲染到纹理,但我似乎没有得到完全准确的结果,除非模型在显示器上显示相对较高的多边形密度。 / p>

所以,例如,如果我渲染一个只包含四个顶点的大平面,我会得到非常不准确的结果,但是如果我细分这个平面,结果对于每个细分都会更准确,最终我得到一个正确渲染的深度缓冲区。

这让我想起了很多关于仿射与透视投影纹理映射问题的事情,我想我需要玩#34; .w"组件以某种方式解决这个问题。但我认为"变化"变量应该考虑到这一点,所以我在这里有点不知所措。

这是我的顶点和片段着色器:

[vert]
uniform mat4 uMVPMatrix;
attribute vec4 aPosition; 
varying float objectDepth;
void main()
{
    gl_Position=uMVPMatrix * aPosition;
    objectDepth=gl_Position.z;
}

[frag]
precision mediump float;
varying float objectDepth;
void main()
{
    //Divide by scene clip range, set to a constant 200 here
    float grayscale=objectDepth/200.0;
    gl_FragColor = vec4(grayscale,grayscale,grayscale,1.0);
}

请注意,为了突出显示我正在使用的方法,此着色器已经简化了很多。虽然在肉眼看来它在大多数情况下似乎运行良好,但我实际上渲染到32位纹理(通过将浮动包装到ARGB中),我需要非常高的精度以便以后处理或者我得到明显的伪像。

通过增加多边形数量可以达到相当高的精度,但是这会使我的帧速率下降很多,那么,有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您需要将z除以w分量。

答案 1 :(得分:0)

这很简单,深度不是线性的,所以你不能对z使用线性插值...如果插入1 / z而不是z,你将很容易解决它。你也可以按照rasmus的建议完成一些数学运算。 您可以在http://www.luki.webzdarma.cz/eng_05_en.htm阅读有关坐标插值的更多信息(有关实现简单软件渲染器的页面)