我正在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?
任何帮助都将是感谢。
答案 0 :(得分:0)
正如@RetoKoradi所说,
如果行大小不是4个字节的倍数,则需要将GL_UNPACK_ALIGNMENT设置为1,这是此值的默认值。
因为每行中有2个浮点数,所以使用2 * 4 = 8个字节,这是默认对齐的倍数(4个字节)。