在某些 IOS 设备中采样 GL_DEPTH24_STENCIL8 深度纹理错误
sample GL_DEPTH24_STENCIL8 depth texture error in some IOS device
我有一个深度纹理,它是 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
这个问题有什么线索吗?或者其他一些调试建议?
您所依赖的精度高于 API 提供的保证。例如,变量 zb
是 lowp
,它只能保证 256 分之一的精度,但是您在计算值时尝试使用在至少需要 1000 分之一的计算中linearz
.
尝试将精度提高到 highp
以超过临界精度阈值。
我有一个深度纹理,它是 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
这个问题有什么线索吗?或者其他一些调试建议?
您所依赖的精度高于 API 提供的保证。例如,变量 zb
是 lowp
,它只能保证 256 分之一的精度,但是您在计算值时尝试使用在至少需要 1000 分之一的计算中linearz
.
尝试将精度提高到 highp
以超过临界精度阈值。