2011-04-07 72 views
1

(iPhone)我试图在ES2中绘制一个立方体,每个面上都有不同的颜色。现在的颜色是不正确的,我不明白为什么。下面是相关的代码:使用颜色的OpenGL ES2.0

- (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" 
    "} 

http://img684.imageshack.us/img684/2316/unled1y.png

回答

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 }, 
    ... 
}; 

它也可以让你只需除以二得到颜色索引,而不是使用尴尬的技巧,其中,顺便说一句,你可能会发现错误。在第一张脸后(i在该点仍为零,因此i%2 == 0),您正在递增颜色索引,因此顶面的第二个三角形与第一个三角形的颜色不同。所有面孔都会出现同样的问题。

+0

我喜欢这样。我做了这些改变,但现在除了一个三角形是黑色外,它全部呈蓝色:'code'( - (void)DrawES2 //加载颜色数据 \t \t glVertexAttribPointer(1,4,GL_UNSIGNED_BYTE,GL_FALSE, 0,faceColors [colorIndex/2]); \t \t glEnableVertexAttribArray(1); \t \t \t \t glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_BYTE,&指数[I]); \t \t \t \t colorIndex ++;) – user617123 2011-04-07 23:31:17

1

您可能已经发现了这一点,但似乎您的颜色数据正在声明并初始化为浮点数,而您将顶点属性数组设置为使用无符号字节。这可能是为什么这些颜色看起来不像你期望的那样。

0

您必须在引擎上启用DEPTH_TEST,否则顶点的绘制顺序将覆盖您的眼睛希望看到的逻辑Z DEPTH。非常非常常见的初始错误。

尝试启用刚清除颜色和深度缓冲区后。

glEnable(GL_DEPTH_TEST);

干杯

1

就更不用说了 - 如果你想使用字节的颜色,使用:

glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, faceColor); 

(GL_TRUE而不是GL_FALSE)看到Techniques for working with vertex data