【问题标题】:sample GL_DEPTH24_STENCIL8 depth texture error in some IOS device某些 IOS 设备中的示例 GL_DEPTH24_STENCIL8 深度纹理错误
【发布时间】: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


【解决方案1】:

您所依赖的精度比 API 保证提供的精度更高。例如,变量zblowp,它只能保证256 分之一的准确度,但是您尝试在计算linearz 的值时至少需要1000 分之一的计算中使用。

尝试将精度提高到highp 以超过临界精度阈值。

【讨论】:

  • 通过“256 精度中的 1 部分”(我也在文档中阅读过),你的意思是 lowp 就像 1 字节精度吗?而“至少千分之一”意味着它需要一个媒介?
  • 是 - 最低保证的 lowp 相对精度为 2^-8(它实际上定义为 10 位浮点类型,具有 1 个符号位、1 个指数位和 8 位尾数)。
  • ... 但请注意,不同的 GPU 可能会在精度上做不同的事情 - 规范定义 minimums 不是绝对要求 - 所以在一个 GPU 上工作的东西可能在另一个 GPU 上不工作.
猜你喜欢
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多