就像下面链接中显示的图片一样。我想用白色为我的机器人手上色(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);
问题出在哪里?
答案 0 :(得分:1)
使用glColorPointer()
,指定颜色数组,每个顶点一个颜色。例如,如果您的立方体有8个顶点,则需要8种颜色的数组。由于每种颜色有3个组件,因此所需阵列的总大小为24个浮点数。
或者,由于每个绘制调用当前有4个顶点,因此颜色数组中需要4种颜色,4 * 3 = 12个浮点值。
使用它的最大优点当然是您可以单独为每个顶点着色。如果你真的想要为每个顶点使用相同的颜色,glColor3f()
实际上是正确的使用调用。或者您可以稍微改变一下:
glColor3fv(playerBodyColor);
这相当于你所拥有的glColor3f()
来电,除非你已经拥有3个数组的颜色,这样会更方便。