GLES20.glTexImage2D 使用 GL_LUMINANCE_ALPHA 加载的损坏数据



我正在使用opengl ES2.0在Android上渲染16位灰度数据。(我正在着色器中处理 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 相同的数据,则像素的上字节无处可见。

我在这里错过了什么吗?

或者任何人都可以提出替代方法吗?

GL_LUMINANCE_ALPHA纹理在所有xyz组件中复制第一个组件。 第二个分量在w中,正如枚举名称的"ALPHA"部分所暗示的那样。 请参阅GL_LUMINANCE_ALPHA格式的定义,请从: http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml

您是否设置了所有像素解包参数?参见glPixelStorei。很可能必须将GL_UNPACK_ALIGNMENT设置为 1。

相关内容

  • 没有找到相关文章

最新更新