2016-08-23 11 views
0

깊이 텍스처가 GL_DEPTH24_STENCIL8 (또는 GL_DEPTH_COMPONENT24)이며 일부 장치 (iPhone5s iPad1)에서이 텍스처를 올바르게 샘플링 할 수 있지만 잘못된 픽셀이 있으면 실패합니다. GPU 질감 (깊이)와 엑스 코드에 의해 캡처 된 형식의 정보를 바인딩 다음은 내가으로 값 클립했습니다샘플 일부 IOS 장치에서 GL_DEPTH24_STENCIL8 깊이 텍스처 오류가 발생했습니다.

bound depth texture enter image description here

주 [0.999, 1] 호모 깊이 이후에 대부분입니다 세트. 텍스처를 샘플링하고 쉐이더에서도 값을 클립합니다. 이다 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 

모든 단서

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); 
} 

그리고이 쉐이더는 위에서 언급 한 장치에서 잘못된 결과를 제공? 아니면 다른 디버그 제안?

+1

모든 것을 강제로 highp로하면 더 잘 작동합니까? 정밀도면에서 API가 보장하는 것에 근접하고 있다고 생각합니다. 예를 들어, zb는 lowp로 256의 정확도로 1 부분만을 보증하지만 linearz 계산에서 1000의 부분을 적어도 하나 필요로하는 계산에 사용하려고합니다. – solidpixel

+0

@lsogen 예! 깊이 텍스처가 올바르게 샘플링되도록하려면 sampler2d가 highp 여야합니다. – zoujyjs

+0

위대한, 다행스럽게 도왔다. 이 줄에 따라 답변을 추가 했으므로 질문이 답변으로 표시됩니다. – solidpixel

답변

1

제공하는 API의 보증보다 더 높은 정확도를 원합니다. 예를 들어, 변수 zblowp이며 이는 256의 정확도로 1 부분만을 보장하지만 linearz의 값을 계산할 때 1000에서 적어도 1 부분이 필요한 계산에 사용하려고합니다.

임계 정밀도 임계 값을 초과하려면 highp으로 정밀도를 높이십시오.

+0

"256 부분 정밀도의 1 부분"(이 기사에서 읽은 부분)은 lowp가 1 바이트 정확도와 같은 의미입니까? 그리고 "1000 분의 1 이상"은 중성자가 필요하다는 것을 의미합니까? – zoujyjs

+0

예 - 최소 보장 된 lowp 상대 정밀도는 2^-8입니다 (효과적으로 10 비트 부동 소수점 유형으로 정의되며 부호 비트 1 개, 지수 비트 1 개 및 가수 8 비트 포함). – solidpixel

+1

...하지만 다른 GPU는 정밀도에 따라 다른 작업을 수행 할 수 있습니다. 사양에서는 절대 요구 사항이 아닌 * 최소값 *을 정의하므로 하나의 GPU에서 작동하는 것은 다른 GPU에서 작동하지 않을 수 있습니다. – solidpixel