【发布时间】:2016-08-25 06:45:31
【问题描述】:
我在 OpenGL 中绘制了一个立方体,但我希望立方体的每个面都填充一种颜色。
这就是我做的,我不知道为什么只有2个脸被填充了颜色。
void DrawCube(GLfloat centerPosX, GLfloat centerPosY, GLfloat centerPosZ, GLfloat edgeLength)
{
GLfloat halfSideLength = edgeLength * 0.5f;
GLfloat vertices[] =
{
// front face
centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // top left
centerPosX + halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // top right
centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // bottom right
centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // bottom left
// back face
centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // top left
centerPosX + halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // top right
centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom right
centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom left
// left face
centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // top left
centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // top right
centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom right
centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // bottom left
// right face
centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // top left
centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // top right
centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom right
centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // bottom left
// top face
centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // top left
centerPosX - halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // top right
centerPosX + halfSideLength, centerPosY + halfSideLength, centerPosZ - halfSideLength, // bottom right
centerPosX + halfSideLength, centerPosY + halfSideLength, centerPosZ + halfSideLength, // bottom left
// bottom face // right face
centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // top left
centerPosX - halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // top right
centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom right
centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength, // bottom left centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ - halfSideLength, // bottom right centerPosX + halfSideLength, centerPosY - halfSideLength, centerPosZ + halfSideLength // bottom left
};
GLfloat colour[] = {
255, 0, 0,
255, 0, 0,
255, 0, 0,
255, 0, 0,
0, 255, 0,
0, 255, 0,
0, 255, 0,
0, 255, 0,
0, 0, 255,
0, 0, 255,
0, 0, 255,
0, 0, 255,
100,100,100,
100,100,100,
100,100,100,
100,100,100,
200,200,200,
200,200,200,
200,200,200,
200,200,200,
40,220,75,
40,220,75,
40,220,75,
40,220,75,
};
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glColorPointer(3, GL_FLOAT, 0, colour);
glDrawArrays(GL_QUADS, 0, 24);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
}
如你所见,我有 1 张红脸、1 张绿脸和 4 张非彩色脸
【问题讨论】:
-
使用 GL_FLOAT 颜色时,颜色必须在 [0, 1] 范围内。
-
谢谢,如果我想使用 [0,255] 范围颜色怎么办?我应该使用什么来代替 GL_FLOAT?
-
@splunk 然后使用其中一种整数类型。
-
GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT确保您的颜色数组也具有您选择的类型。 -
@splunk 我认为,您的顶点顺序错误。默认情况下逆时针,您使用顺时针顺序。当然,你有错误的颜色(你应该使用 0.0f-1.0f)