opengles 3.0 RG8 RG16F纹理

时间:2015-12-24 07:26:34

标签: android opengl-es-3.0

我正在Android上开发一些Image-Process程序。 我想将一些字节和浮点数据放入纹理中。我做到了。

GLfloat test_float[8] = {
            1.0f,2.0f,
            3.0f,4.0f,
            5.0f,6.0f,
            7.0f,8.0f
};
GLbyte test_byte[8] = {
            //1,2,0,0,3,4,0,0,5,6,0,0,7,8,0,0,
            1,2,3,4,5,6,7,8
};
glGenTextures(1, &floatTexture);
glBindTexture(GL_TEXTURE_2D, floatTexture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, 1, 4, 0, GL_RG,
            GL_UNSIGNED_BYTE, test_byte);

glTexParameterf(GL_TEXTURE_2D,
        GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,
        GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,
        GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D,
        GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glUseProgram(program);
GLuint location = glGetUniformLocation(program,"uInputTex");
glUniform1i(location,0);
glDrawArrays(GL_TRIANGLE_STRIP,0,4);
GLubyte* datas = new GLubyte[32];
memset(datas,0,32*sizeof(GLubyte));
glReadPixels(0, 0, 1, 4, GL_RGBA, GL_UNSIGNED_BYTE, datas);
for(int i=0;i<32;) {
    __android_log_print(ANDROID_LOG_INFO,"TEST","R %d G %d B %d A %d",datas[i++],datas[i++],datas[i++],datas[i++]);
}

我的着色器什么都不做。 片段着色器代码是:

varying vec2 v_texCoord;
uniform sampler2D uInputTex;
void main (){
    gl_FragColor = vec4(texture2D(uInputTex, v_texCoord).rgba);
    //gl_FragColor = vec4(texture2D(uInputTex, v_texCoord).rgba)/255.0;  // if texture data is float this will be used .
});

我使用字节数据创建纹理(test_byte

运行程序

我得到了:

 R 1 G 2 B 0 A 255
 R 5 G 6 B 0 A 255
 R 0 G 0 B 0 A 255
 R 0 G 0 B 0 A 255

我用浮动数据创建纹理(test_float)运行程序。 由glTexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, 1, 4, 0, GL_RG,GL_FLOAT, test_float);

创建的纹理

我得到了:

 R 1 G 2 B 0 A 0
 R 3 G 4 B 0 A 0
 R 5 G 6 B 0 A 0
 R 7 G 8 B 0 A 0

为什么我在使用字节数据纹理时错过了3,4和7,8?

任何帮助都将是感谢。

1 个答案:

答案 0 :(得分:0)

正如@RetoKoradi所说,

  

如果行大小不是4个字节的倍数,则需要将GL_UNPACK_ALIGNMENT设置为1,这是此值的默认值。

     

因为每行中有2个浮点数,所以使用2 * 4 = 8个字节,这是默认对齐的倍数(4个字节)。