我正在尝试使用以下代码:
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不起作用?
系统:
答案 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);
不起作用,glEnableClientState
将GLenum
视为agrument,不 GLbitfield
。那些枚举值不是单个位,因此它们的二进制OR可以是任何东西 - 这应该只生成GL_INVALID_ENUM
错误。
您必须通过单独的呼叫启用/禁用每个阵列:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);