我使用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相同,像素的高位字节无处可见。
我是不是漏掉了什么?
或者,有没有人能建议一种替代方法?
发布于 2013-02-02 21:43:48
GL_LUMINANCE_ALPHA纹理跨所有x、y和z组件复制第一个组件。第二个组件在w中,正如枚举名称的"ALPHA“部分所暗示的那样。请参阅http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml中的GL_LUMINANCE_ALPHA格式定义
发布于 2013-02-02 21:40:47
你是否设置了所有的像素解包参数?参见glPixelStorei。最有可能的情况是您必须将GL_UNPACK_ALIGNMENT设置为1。
https://stackoverflow.com/questions/14662268
复制相似问题