У меня есть текстура глубины, которая равна GL_DEPTH24_STENCIL8
(или GL_DEPTH_COMPONENT24
), и я могу корректно пробовать эту текстуру на некоторых устройствах (iPhone5s iPad1), но терпеть неудачу с некоторыми недопустимыми пикселями. После связан GPU текстуры (глубина) и информации формата захваченного Xcode:образец GL_DEPTH24_STENCIL8 ошибка текстуры глубины в некотором устройстве IOS
Обратите внимание, что я клип значение в [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, что гарантировало бы только 1 часть с точностью 256, но затем вы попытаетесь использовать в вычислении, в котором вам нужно как минимум 1 часть в 1000 в вашем вычислении linearz. – solidpixel
@lsogen Да! оказывается, что sampler2d должен быть highp для правильной выборки текстуры глубины. – zoujyjs
Отлично, рад, что это помогло. Я добавил ответ в этом направлении, так что вопрос возникает, как ответ. – solidpixel