次のフラグメントシェーダーを使用してYV12をRGBに変換しようとしています。
precision mediump float;
uniform sampler2D tex0, tex1, tex2;
varying vec2 v_texCoord;
void main(void) {
float r, g, b, y, u, v;
y = texture2D(tex0, v_texCoord).x;
u = texture2D(tex1, v_texCoord).x;
v = texture2D(tex2, v_texCoord).x;
y = 1.1643 * (y - 0.0625);
u = u - 0.5;
v = v - 0.5;
r = y + 1.5958 * v;
g = y - 0.39173 * u - 0.81290 * v;
b = y + 2.017 * u;
gl_FragColor = vec4(r, g, b, 1.0);
}
以下は、元の画像とそれに続く変換された画像です。出力に基づいて、不適切なデコードの原因を特定するためにどこを見ればよいかを判断できますか?
ファーストレスポンダーが言ったように、1行あたりのバイト数には間違いなく問題があります。別のことかな。YV12にはサブサンプリングされたUおよびVチャネルがあります。シェーダーでこの寸法変更をどのように管理しますか?テクスチャのサイズはどのくらいですか?OpenGLにこれを処理させますか?
—
ステファンPéchard
描画ループでは、画像データは3要素配列で与えられ、順序は常にYUVです(YV12やYUV420pなどに関係ありません)。Y要素には幅/高さ全体を使用し、UV要素には幅/高さを右に1(2で除算)シフトします。これらのテクスチャは、残りを処理するシェーダーにバインドされます。私が扱ってきたテクスチャサイズは通常1280x720です。
—
エラー454