首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLES20.glTexImage2D使用GL_LUMINANCE_ALPHA加载的数据损坏

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

Stack Overflow用户
提问于 2013-02-02 21:16:47
回答 2查看 1.1K关注 0票数 0

我使用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绘制像素来重建原始分辨率。代码如下所示:

代码语言:javascript
复制
 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代码从:

代码语言:javascript
复制
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 320, 512, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, sBuffer);

代码语言:javascript
复制
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相同,像素的高位字节无处可见。

我是不是漏掉了什么?

或者,有没有人能建议一种替代方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-02 21:43:48

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

票数 1
EN

Stack Overflow用户

发布于 2013-02-02 21:40:47

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14662268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档