2016-08-23 7 views
0

У меня есть текстура глубины, которая равна GL_DEPTH24_STENCIL8 (или GL_DEPTH_COMPONENT24), и я могу корректно пробовать эту текстуру на некоторых устройствах (iPhone5s iPad1), но терпеть неудачу с некоторыми недопустимыми пикселями. После связан GPU текстуры (глубина) и информации формата захваченного Xcode:образец GL_DEPTH24_STENCIL8 ошибка текстуры глубины в некотором устройстве IOS

bound depth texture enter image description here

Обратите внимание, что я клип значение в [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); 
} 

И шейдер дает неправильный результат на устройствах, указанных выше: enter image description here

Устройство и информация драйвера:

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 

Все ключи к этой проблеме? Или некоторые другие предложения отладки?

+1

Если вы заставляете все использовать highp, это работает лучше? Я подозреваю, что вы обходитесь близко к тому, что API гарантирует с точки зрения точности. Например, zb является lowp, что гарантировало бы только 1 часть с точностью 256, но затем вы попытаетесь использовать в вычислении, в котором вам нужно как минимум 1 часть в 1000 в вашем вычислении linearz. – solidpixel

+0

@lsogen Да! оказывается, что sampler2d должен быть highp для правильной выборки текстуры глубины. – zoujyjs

+0

Отлично, рад, что это помогло. Я добавил ответ в этом направлении, так что вопрос возникает, как ответ. – solidpixel

ответ

1

Вы полагаетесь на более высокую точность, чем гарантируете API. Например, переменная zb равна lowp, которая гарантировала бы только 1 часть с точностью 256, но затем вы попытаетесь использовать ее при вычислении, в котором при вычислении значения linearz потребуется по меньшей мере 1 часть в 1000.

Попробуйте увеличить точность до highp, чтобы преодолеть критический предел точности.

+0

Под «1 частью по 256 точности» (что я также читал в документе), вы считаете, что lowp похож на 1 байтную точность? И «по крайней мере 1 часть в 1000» означает, что ему нужен средний пакет? – zoujyjs

+0

Да - минимальная гарантированная относительная точность lowp составляет 2^-8 (она эффективно определяется как 10-битный тип с плавающей запятой, с одним битом знака, одним битом экспоненты и 8 бит мантиссы). – solidpixel

+1

... но обратите внимание, что разные графические процессоры могут делать разные вещи с точностью - спецификация определяет минимальные значения * не абсолютные требования, поэтому то, что работает на одном графическом процессоре, может не работать на другом. – solidpixel