使用(3x3)颜色数组纹理化GL_QUADS将忽略每行中的第4种颜色

时间:2015-03-03 13:18:56

标签: arrays opengl texture-mapping

我试图从字节数组生成3x3纹理。

我的问题是我需要在每一行的最后给出一个额外的颜色以获得我想要的东西,我想知道原因。

我忽略的字节数是否存在问题或类似的问题?

这是我的阵列:

GLubyte data[33] = { 
                    //bottom row
                    0, 0, 150,
                    150, 10, 220,
                    150, 150, 56,

                    0, 0, 0,        //must be here to get what I want but don't render

                    //middle row
                    150, 150, 150,
                    150, 0, 21,
                    0, 255, 0,

                    0, 0, 0,        //must be here to get what I want but don't render

                    //top row
                    250, 150, 0,
                    250, 0, 150,
                    0, 150, 0 };

我的纹理生成:

GLuint texture;

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

//I thing the problem is right here
glTexImage2D(GL_TEXTURE_2D, 0, 3, 3, 3, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

return texture;

我正在应用这样的纹理:

GLuint texture = genTexture(0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);

glBegin(GL_QUADS);
    glTexCoord2f(1.0f, 0.0f); glVertex2f(0.5f, -0.5f);
    glTexCoord2f(1.0f, 1.0f); glVertex2f(0.5f, 0.5f);
    glTexCoord2f(0.0f, 1.0f); glVertex2f(-0.5f, 0.5f);
    glTexCoord2f(0.0f, 0.0f); glVertex2f(-0.5f, -0.5f);
glEnd();

结果是忽略每行的这24位:

Result

2 个答案:

答案 0 :(得分:1)

我会调查GL_UNPACK_ALIGNMENT像素存储参数的环境值。 The manual说:

  

GL_UNPACK_ALIGNMENT

     

指定内存中每个像素行开头的对齐要求。允许值为1(字节对齐),2(行与偶数字节对齐),4(字对齐)和8(行在双字边界上开始)。

该手册页说明"初始值"确实是4

使用合适的glGetInteger()调用来读取值。

答案 1 :(得分:0)

您需要设置GL_UNPACK_ALIGNMENT像素存储参数才能使其正常工作:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

它控制传递给glTexImage2D()的数据中行的对齐方式。默认值为4.在您的情况下,由于每行包含9个字节的数据(3种颜色,每个3个字节),对齐值4将行大小四舍五入为12.这意味着将读取12个字节每行,并解释为什么它在每行末尾添加额外的3个字节时有效。

将对齐设置为1,您将不需要额外的填充。