OpenGL不会在启用GL_COLOR_ARRAY的情况下绘制四边形

时间:2014-05-18 16:58:25

标签: c++ opengl

我正在尝试使用以下代码:

GLfloat *vbuffer = new GLfloat[24] {
    0,0,0,
    10,0,0,
    0,10,0,
    0,0,10,
    10,10,0,
    10,0,10,
    0,10,10,
    10,10,10
};
GLubyte *cbuffer = new GLubyte[32] {
    255,0,0,255,
    0,255,0,255,
    0,0,255,255,
    255,255,0,255,
    255,0,255,255,
    0,255,255,255,
    0,0,0,255,
    255,255,255,255
};

GLuint *ibuffer = new GLuint[24] {
    0,1,4,2,
    0,2,6,3,
    0,3,5,1,
    1,4,7,5,
    5,7,6,3,
    2,6,7,4
};

//...

glColor4f(1,1,1,1);

glEnableClientState(GL_VERTEX_ARRAY | GL_COLOR_ARRAY);

glColorPointer(4, GL_UNSIGNED_BYTE, 0, cbuffer);
glVertexPointer(3, GL_FLOAT, 0, vbuffer);
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, ibuffer);

glDisableClientState(GL_VERTEX_ARRAY | GL_COLOR_ARRAY);

未绘制所需的立方体,而始终显示使用glVertex3f绘制的坐标轴。

当我从GL_COLOR_ARRAY中移除glEnableClientState时,根据指示将立方体绘制为完全白色。

我做错了什么?为什么glColorPointer-stuff不起作用?


系统:

  • Kubuntu 13.04,64位
  • Intel HD Graphics 3000
  • OpenGL 3.0(Mesa 9.1.7)

2 个答案:

答案 0 :(得分:4)

数组标识符不是位掩码。

一般来说,如果它的名称中没有采用GL_..._BIT形式,那么就不能将OR二进制glEnableClientState (GL_VERTEX_ARRAY); glEnableClientState (GL_COLOR_ARRAY); 以产生有意义的东西。

要正确执行此操作,您需要:

GL_VERTEX_ARRAY

顺便说一下,永远禁用{{1}}是没有意义的。如果没有顶点位置,则无法绘制任何内容,因此通常在应用程序初始化时启用该状态,从不触及。

答案 1 :(得分:3)

此:

glEnableClientState(GL_VERTEX_ARRAY | GL_COLOR_ARRAY);

不起作用,glEnableClientStateGLenum视为agrument, GLbitfield。那些枚举值不是单个位,因此它们的二进制OR可以是任何东西 - 这应该只生成GL_INVALID_ENUM错误。

您必须通过单独的呼叫启用/禁用每个阵列:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);