【发布时间】:2016-12-30 09:33:16
【问题描述】:
我有一个深度纹理,它是GL_DEPTH24_STENCIL8(或GL_DEPTH_COMPONENT24),我可以在某些设备(iPhone5s iPad1)上正确地采样这个纹理,但由于一些无效像素而失败。以下是绑定的gpu纹理(深度)和xcode捕获的格式信息:
请注意,我已将值裁剪为 [0.999, 1],因为同型深度大部分都在集合中。我也在对纹理进行采样并在我的着色器中剪辑值。
uniform sampler2D tex0;
varying mediump vec2 TexCoord0;
void ps_main()
{
float bias = 0.0;
lowp vec4 zb = texture2D(tex0, TexCoord0, bias);
const mediump float mag = 20.0;
mediump float linearz = (zb - 0.999) / (1.0 - 0.999)
gl_FragColor = vec4(linearz, linearz, linearz, 1.0);
}
设备和驱动信息是:
Driver: OpenGLES2
Description: Apple A8 GPU
Version: OpenGL ES 2.0 Apple A8 GPU - 77.14
Vendor: Apple Inc.
Width: 2048, Height: 1536, BitDepth: 32
这个问题有什么线索吗?或者其他一些调试建议?
【问题讨论】:
-
如果你把所有东西都强制到 highp 效果会更好吗?我怀疑您正在接近 API 在精度方面所保证的内容。例如,zb 是 lowp,它只能保证 256 分之一的准确度,但您随后尝试在需要至少 1000 分之一的 linearz 计算中使用。
-
@lsogen 是的!事实证明 sampler2d 需要 highp 才能正确采样深度纹理。
-
太好了,很高兴它有帮助。我已经按照这条线添加了一个答案,只是为了让问题显示为已回答。
标签: ios opengl-es glsl texture2d depth-buffer