(iPhone)我试图在ES2中绘制一个立方体,每个面上都有不同的颜色。现在颜色不正确,我无法弄清楚原因。这是相关的代码:
- (void) DrawES2 {
glViewport ( 0, 0, backingWidth, backingHeight );
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glUseProgram ( programObject );
int colorIndex = 0;
BOOL newFace = NO;
for(int i = 0; i < 36; i += 3)
{
GLfloat faceColor[] = { faceColors[colorIndex], faceColors[colorIndex+1], faceColors[colorIndex+2], faceColors[colorIndex+3] };
// Load the vertex data
glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
glEnableVertexAttribArray ( 0 );
// Load the color data
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, faceColor);
glEnableVertexAttribArray( 1 );
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, &indices[i]);
newFace = ( i%2 == 0 ) ? NO : YES;
if( newFace )
colorIndex+=4;
}
}
GLfloat vVertices[] = { -0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, -0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f };
// Used to draw cube more efficiently
GLubyte indices[36] = {
4, 7, 3, //top face
4, 3, 0,
5, 6, 7, //front face
5, 7, 4,
3, 2, 1, //back face
0, 3, 1,
6, 2, 3, //right face
6, 3, 7,
5, 0, 1, //left face
5, 4, 0,
5, 2, 6, //bottom face
5, 1, 2 };
const GLfloat faceColors[] = {
0, 1, 0, 1,
1, 0.5f, 0, 1,
1, 0, 0, 1,
1, 1, 0, 1,
0, 0, 1, 1,
1, 0, 1, 1
};
GLbyte vShaderStr[] =
"uniform mat4 t_matrix; \n"
"uniform mat4 r_matrix; \n"
"uniform mat4 u_proj_matrix; \n"
"attribute vec4 vPosition; \n"
"attribute vec4 a_color; \n"
"varying vec4 v_color; \n"
"void main() \n"
"{ \n"
" mat4 model_matrix = t_matrix * r_matrix; \n"
" mat4 mvp_matrix = u_proj_matrix * model_matrix; \n"
" gl_Position = mvp_matrix * vPosition; \n"
" v_color = a_color; \n"
"} \n";
GLbyte fShaderStr[] =
"precision mediump float; \n"
"varying vec4 v_color; \n"
"void main() \n"
"{ \n"
" gl_FragColor = v_color; \n"
"}
答案 0 :(得分:1)
您可能已经发现了这一点,但是当您将顶点属性数组设置为使用无符号字节时,似乎您的颜色数据被声明并初始化为浮点数。这可能就是为什么颜色看起来不像你期望的那样。
答案 1 :(得分:1)
提一下 - 如果你想使用字节表示颜色,请使用:
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, faceColor);
(GL_TRUE而不是GL_FALSE)请参阅Techniques for working with vertex data
答案 2 :(得分:0)
如果通过嵌套数组定义顶点和元素数据,您会发现逻辑更清晰:
GLubyte vVertices[][3] = {
{ -0.5f, -0.5f, 0.5f },
{ 0.5f, -0.5f, 0.5f },
...
};
GLubyte indices[][3] = {
{ 4, 7, 3 }, //top face
{ 4, 3, 0 },
...
};
GLfloat faceColors[][4] = {
{ 0, 1, 0, 1 },
{ 1, 0.5, 0, 1 },
...
};
它还允许你简单地除以2来获得颜色索引,而不是使用笨拙的i%2
技巧,BTW,你可能会找到这个bug。您正在增加第一个面后的颜色索引(此时i
仍为零,所以i%2 == 0
),因此顶面的第二个三角形与第一个面的颜色不同;所有面孔都会出现同样的问题。
答案 3 :(得分:0)
您必须在引擎上启用DEPTH_TEST,否则顶点的绘制顺序将覆盖您的眼睛期望看到的逻辑Z深度。非常常见的初始错误。
在清除颜色和深度缓冲区后尝试启用。
glEnable(GL_DEPTH_TEST);
干杯