0

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

問題がここにあることがわかりました:

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

GL_UNSIGNED_BYTE の代わりに GL_FLOAT を使用すると、色の形式が一致しないためエラーが発生します。リンクから、https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xmlは、サポートされているすべての形式が 0 ~ 1 の範囲にクランプされるように見えます。次のテクスチャでも負の値を取得する方法。

GL_R16F などの他の画像形式を使用できることがわかりましたが、リンク/GLES20 ではいずれもサポートされていません。

4

2 に答える 2

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)
于 2016-04-26T19:09:57.280 に答える
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);

于 2016-04-26T09:19:13.087 に答える