【问题标题】:OpenGL ES2.0 colors not coming out rightOpenGL ES2.0 颜色不正确
【发布时间】:2019-08-10 16:30:16
【问题描述】:

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

【问题讨论】:

    标签: iphone opengl-es-2.0


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      顺便提一下——如果你想使用字节来表示颜色,请使用:

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

      (GL_TRUE 代替 GL_FALSE)见 Techniques for working with vertex data

      【讨论】:

        【解决方案3】:

        如果你通过嵌套数组定义顶点和元素数据,你会发现你的逻辑更清晰:

        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 技巧,顺便说一句,这就是您可能会发现错误的地方。您在第一个面之后增加颜色索引(i 在该点仍然为零,所以i%2 == 0),所以顶面的第二个三角形的颜色与第一个不同;所有面孔都会出现同样的问题。

        【讨论】:

        • 我喜欢这样。我进行了更改,但现在除了一个黑色的三角形外,它都是蓝色的: 'code'(- (void) DrawES2 // 加载颜色数据 glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0, faceColors[ colorIndex/2]); glEnableVertexAttribArray( 1 ); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, &indices[i]); colorIndex++;)
        【解决方案4】:

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

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

        glEnable(GL_DEPTH_TEST);

        干杯

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-19
          • 1970-01-01
          相关资源
          最近更新 更多