0

2次元テクスチャにオフスクリーンレンダリングを使用しています。 最初のシェーダはYUV値を出力し、2番目のフラグメントシェーダはオフスクリーンテクスチャからYUVを読み込みます。 2番目のシェーダでは、UとVを操作して-0.5〜0.5の範囲にします。しかし、レンダリングしようとするとすぐに0から1(正の値)にクランプされます。すべての私の負の値は、問題はここにあることがわかっ0Android:オフスクリーンテクスチャの負の値が0にクランプされる

になる:

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 
       width, height, 0, GLES20.GL_RGBA, 
       GLES20.GL_UNSIGNED_BYTE, null) 

私はGL_FLOATの代わりGL_UNSIGNED_BYTEを使用している場合はカラーフォーマットが一致ではないとして、それは私にエラーを与えるだろう。 リンクから、https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xmlは、サポートされているすべてのフォーマットが0-1の範囲に固定されているように見えます。 次のテクスチャでも負の値を取得する方法。

私はGL_R16Fのような他のイメージフォーマットを使うことができますが、どれもG​​LES20のリンク/でサポートされていません。

答えて

1

GL_UNSIGNED_BYTEの使用を続ける方が良いでしょうが、最初のシェーダーに書き込む前に、UV値を-1から1の範囲から0から1の範囲に再マップするだけです。次に、2番目のシェーダでそれらを読み取った後、0から1の範囲から-1から1の範囲にマップし直します。

これは、各シェーダで余分な積和演算を行い、テクスチャのメモリ/バンド幅を大幅に節約します。

シェーダの終わり1

vShader1Output = vUVBetweenNeg1And1 * vec2(0.5, 0.5) + vec2(0.5, 0.5); 

シェーダ2の開始

vShader2Input = vUVFromShader1Texture * vec2(2.0, 2.0) - vec2(1.0, 1.0) 
0

私は、以下の変更の問題を解決することができます:

最終int型GL_HALF_FLOAT_OES = 0x8D61。

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D、0、GLES20.GL_RGBA、 幅、高さ、0、GLES20.GL_RGBA、 GL_HALF_FLOAT_OES、NULL);

関連する問題