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

s3l*_*lph 1 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);
Run Code Online (Sandbox Code Playgroud)

未绘制所需的立方体,而用 绘制的坐标轴glVertex3f始终出现。

当我删除GL_COLOR_ARRAYfrom时glEnableClientState,立方体将按照指示完全绘制为白色。

我究竟做错了什么?为什么 glColorPointer 的东西不起作用?


系统:

  • 库班图 13.04,64 位
  • 英特尔高清显卡 3000
  • OpenGL 3.0(梅萨 9.1.7)

And*_*man 5

数组标识符不是位掩码。

一般来说,如果它不采用GL_..._BIT名称中的形式,则不能将其二进制组合OR在一起以产生有意义的内容。

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

glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_COLOR_ARRAY);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,禁用确实没有意义GL_VERTEX_ARRAY。如果没有顶点位置,您就无法绘制任何东西,因此该状态通常在应用程序初始化时启用,并且从未触及。