Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GLES20.glTexImage2D使用GL_亮度_ALPHA加载的损坏数据_Android_Opengl Es_Glteximage2d - Fatal编程技术网

Android GLES20.glTexImage2D使用GL_亮度_ALPHA加载的损坏数据

Android GLES20.glTexImage2D使用GL_亮度_ALPHA加载的损坏数据,android,opengl-es,glteximage2d,Android,Opengl Es,Glteximage2d,我正在使用opengl ES2.0在Android上渲染16位灰度数据。(我在着色器中处理16位到8位的动态范围缩放,16位输入是必需的,因为它是数据的传入格式。)分辨率为640x512 目前,我通过将像素2一次推入320x512 32位RGBA纹理来实现这一点。i、 e: texture2D(thData,vtexturecord)[0]是像素i低位字节 texture2D(thData,vtexturecord)[1]是像素i高位字节 texture2D(thData,vtexturecor

我正在使用opengl ES2.0在Android上渲染16位灰度数据。(我在着色器中处理16位到8位的动态范围缩放,16位输入是必需的,因为它是数据的传入格式。)分辨率为640x512

目前,我通过将像素2一次推入320x512 32位RGBA纹理来实现这一点。i、 e:

texture2D(thData,vtexturecord)[0]
是像素
i
低位字节

texture2D(thData,vtexturecord)[1]
是像素
i
高位字节

texture2D(thData,vtexturecord)[2]
是像素
i+1
低位字节

texture2D(thData,vtexturecord)[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);

然而,当我这样做时,我似乎在纹理中得到奇怪的数据
texture2D(thData,vtexturecord)[0]
看似正确,但
texture2D(thData,vtexturecord)[1]
与元素0具有相同的数据,无法看到像素的上字节

我有什么遗漏吗


或者有人能推荐一种替代方法吗?

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

GL_LUMINANCE_ALPHA
纹理在所有
x
y
z
组件中复制第一个组件。第二个组件位于
w
,正如枚举名称的“
ALPHA
”部分所示。请参见
GL\u LUMINANCE\u ALPHA的定义格式:

非常好!索引
texture2D(thData,vtexturecord)[3]
有效。然而,这是否意味着我的假设是错误的,即亮度α将使用RGBA的一半内存?@LukeAP:不,内存使用不会改变。这纯粹是一个着色器的东西。
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE_ALPHA, 640, 512, 0, GLES20.GL_LUMINANCE_ALPHA, GLES20.GL_UNSIGNED_BYTE, sBuffer);