iPad / OpenGL ES 2.0上纹理查找的舍入误差

时间:2013-06-28 21:12:28

标签: ios ipad opengl-es opengl-es-2.0

我正在使用附加到帧缓冲区的纹理作为自定义深度缓冲区。在第一个渲染过程中,我渲染到纹理,以便存储深度值。在第二个渲染过程中,我从这个纹理中进行查找,以决定是否渲染或丢弃片段。

这很有效,除了在设备(iPad 3)上,有一些恼人的瑕疵似乎来自某种舍入错误,当深度值写入纹理时会发生。我尝试将一些固定值(例如0.5)写入纹理,但是当从纹理中读回时,它比0.03更高或更低{。}}。

我将深度值编码为三个RGB值(第四个组件,alpha或0.5,将被忽略):

w

这样,我得到3x8位精度来存储深度(灵感来自http://www.rojtberg.net/348/powervr-sgx-530-does-not-support-depth-textures

在另一个片段着色器(第二个渲染过程)中,我从纹理中读取:

const highp vec4 packFactors = vec4(1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0);
const highp vec4 cutoffMask  = vec4(1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0, 0.0);

void main() {
    highp float depth = ...
    ...
    highp vec4 packedVal = fract(packFactors * depth);
    packedVal.x = depth;      // undo effect of fract() on x component
    gl_FragColor = packedVal - packedVal.yzww * cutoffMask;
}

使用 highp vec4 depthBufferLookup = texture2D(depthTexture, vDepthTex); highp float depthFromDepthBuffer = dot(depthBufferLookup, vec4(1.0) / packFactors); 中与第一个着色器相同的值。

我希望这个程序能够提供一个不错的精度,但是packFactors的错误超过0.03会使它非常不可用。

任何提示?

BTW我正在使用以下纹理类型:

0.5

0 个答案:

没有答案