OpenGL:使用glColorPointer使颜色变得怪异

时间:2015-06-13 12:48:46

标签: opengl

就像下面链接中显示的图片一样。我想用白色为我的机器人手上色(RGB:0.9 0.9 0.9)。当我使用glColor3f时,白色显示正确。但是当我将RGB数据存储在GLfloat数组中并调用glColorPointer时,颜色变得如此奇怪。

这是右臂代码

 static const GLfloat playerBodyColor[] = {0.9, 0.9, 0.9};

 glEnableClientState(GL_COLOR_ARRAY);
 //glColor3f(0.9, 0.9, 0.9);
 glColorPointer(3, GL_FLOAT, 0, playerBodyColor);
 glTranslatef(0.0, player_body_height/6, player_body_width/2+LENGTH_UNIT/2);
 glRotatef(340.0, 0.0, 0.0, 1.0);
 glPushMatrix();
 glTranslatef(2*LENGTH_UNIT, 0.0, 0.0);
 glScalef (4.0, 1.0, 1.0);
 copyCodeSolidCube (LENGTH_UNIT);
 glDisableClientState(GL_COLOR_ARRAY);
 glPopMatrix();

如果我改变这样的代码:

 static const GLfloat playerBodyColor[] = {0.9, 0.9, 0.9};


 //glEnableClientState(GL_COLOR_ARRAY);
 glColor3f(0.9, 0.9, 0.9);
 //glColorPointer(3, GL_FLOAT, 0, playerBodyColor);
 glTranslatef(0.0, player_body_height/6, player_body_width/2+LENGTH_UNIT/2);
 glRotatef(340.0, 0.0, 0.0, 1.0);
 glPushMatrix();
 glTranslatef(2*LENGTH_UNIT, 0.0, 0.0);
 glScalef (4.0, 1.0, 1.0);
 copyCodeSolidCube (LENGTH_UNIT);
 //glDisableClientState(GL_COLOR_ARRAY);
 glPopMatrix();

颜色显示正确。

正确颜色代码的图片: http://imgur.com/S6zt5wf

错误颜色代码的图片: http://imgur.com/8m5Ag1O

在代码中,我还调用了一个函数copyCodeSolidCube。 以下是copyCodeSolidCube代码的一部分:

glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_NORMAL_ARRAY);
glVertexPointer (3, GL_FLOAT, 0, vert);
glNormalPointer (GL_FLOAT, 0, norm);

glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, one);
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, two);
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, three);
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, four);
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, five);
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, six);

glDisableClientState (GL_VERTEX_ARRAY);
glDisableClientState (GL_NORMAL_ARRAY);

问题出在哪里?

1 个答案:

答案 0 :(得分:1)

使用glColorPointer(),指定颜色数组,每个顶点一个颜色。例如,如果您的立方体有8个顶点,则需要8种颜色的数组。由于每种颜色有3个组件,因此所需阵列的总大小为24个浮点数。

或者,由于每个绘制调用当前有4个顶点,因此颜色数组中需要4种颜色,4 * 3 = 12个浮点值。

使用它的最大优点当然是您可以单独为每个顶点着色。如果你真的想要为每个顶点使用相同的颜色,glColor3f()实际上是正确的使用调用。或者您可以稍微改变一下:

glColor3fv(playerBodyColor);

这相当于你所拥有的glColor3f()来电,除非你已经拥有3个数组的颜色,这样会更方便。