Androidで16ビットグレースケールデータをレンダリングするためにopengl ES2.0を使用しています。(シェーダーで 16 ビットから 8 ビットへのダイナミック レンジ スケーリングを処理しています。データの入力形式であるため、16 ビット入力は必須です。) 解像度は 640x512 です。
現時点では、一度に 2 つのピクセルを 320x512 32 ビット RGBA テクスチャにプッシュすることで、これを機能させています。すなわち:
texture2D(thData, vTextureCoord)[0]
はピクセルi
下位バイト、
texture2D(thData, vTextureCoord)[1]
はピクセルi
の上位バイト、
texture2D(thData, vTextureCoord)[2]
はピクセルi+1
下位バイト、
texture2D(thData, vTextureCoord)[3]
ピクセルi+1
の上位バイトです。
これからデータを再構築することはできますが、640x512 バッファにレンダリングし、gl_FragCoord.x と条件ステートメントを使用してピクセルをチャネル 0,1 または 2,3 から描画するかどうかを決定することにより、元の解像度を再構築しました。コードは次のようになります。
private final String mFragmentShader =
"precision highp float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform sampler2D thData;\n" +
"void main() {\n" +
//This works out whether the pixel is in an odd or even column:
"int odd = 0;\n" +
"if (fract(gl_FragCoord.x/2.) >= 0.5) odd = 2;\n"+
//This chooses the channels based on the column number
"float data =((texture2D(thData, vTextureCoord)[odd]) + (texture2D(thData, vTextureCoord)[odd+1]*256.))*256.;\n" +
これは原則としては問題ありませんが、何らかの理由でいくつかの列がスワップされているように見えます。私の推測では、丸めエラーが原因で条件ステートメントから誤った結果が生じる可能性があります。
私がやりたいことは、最初に 16 ビットのフル解像度のテクスチャを使用してダウン サンプリングを回避することです。これは非常に簡単に思えます。glTexImage2D コードを次のように変更しました。
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 320, 512, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, sBuffer);
に
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE_ALPHA, 640, 512, 0, GLES20.GL_LUMINANCE_ALPHA, GLES20.GL_UNSIGNED_BYTE, sBuffer);
ただし、これを行うと、テクスチャに奇妙なデータが表示されるようです。texture2D(thData, vTextureCoord)[0]
正しいように見えますがtexture2D(thData, vTextureCoord)[1]
、要素 0 と同じデータを持ち、ピクセルの上位バイトはどこにも見られません。
ここで何か不足していますか?
または、誰かが別のアプローチを提案できますか?