2016-08-23 14 views
0

深度テクスチャがGL_DEPTH24_STENCIL8(またはGL_DEPTH_COMPONENT24)ですが、一部のデバイス(iPhone5s iPad1)でこのテクスチャを正しくサンプリングできますが、無効なピクセルで失敗します。私はに値をクリップしましたサンプルGL_DEPTH24_STENCIL8一部のIOSデバイスの深度テクスチャエラー

bound depth texture enter image description here

注[0.999、1]ホモ深以来で、主に以下のとおりです。次のようにGPUのテクスチャ(深さ)とXcodeで捕捉フォーマット情報バインドされていますセット。私はテクスチャをサンプリングして、シェーダの値もクリップします。

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

すべてを強制的にハイパーにすると、よりうまく動作しますか?私はあなたが、APIが精度に関して保証しているものに近いところにいると考えています。例えば、zbはlowpで256の精度で1つの部分しか保証しませんが、linearz計算で1000に少なくとも1を必要とする計算で使用しようとします。 – solidpixel

+0

@lsogenはい!深さテクスチャが正しくサンプリングされるためには、sampler2dがhighpである必要があることが分かります。 – zoujyjs

+0

よかった、うれしかった。私はこの行に沿って答えを加えました。質問が答えた通りに表示されます。 – solidpixel

答えて

1

あなたは、提供するAPIの保証よりも高い精度に頼っています。たとえば、変数zblowpで、256精度で1部分しか保証されませんが、linearzの値を計算する場合、1000で少なくとも1の部分を必要とする計算で使用しようとします。

highpに精度を上げて、限界精度のしきい値を超えるようにしてください。

+0

"1の精度で256の精度"(これも私がこの文書で読んだこと)は、lowpは1バイトの精度のような意味ですか?そして、 "1000の少なくとも1つの部分は"それがmediumpを必要とすることを意味するか? – zoujyjs

+0

はい - 最低保証されたlowpの相対精度は2^-8です(事実上10ビットの浮動小数点型として定義され、1つの符号ビット、1つの指数ビット、および8ビットの仮数があります)。 – solidpixel

+1

...ただし、GPUごとに精度が異なる場合があります。仕様では、最小要件*絶対条件が定義されていないため、あるGPUで動作するものが別のGPUで動作しない可能性があります。 – solidpixel

関連する問題