Цвета OpenGL ES2.0 отображаются неправильно

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


person user617123    schedule 07.04.2011    source источник


Ответы (4)


Вы, вероятно, уже нашли это, но похоже, что ваши данные о цвете объявляются и инициализируются как числа с плавающей запятой, пока вы настраиваете массив атрибутов вершины для использования байтов без знака. Возможно, поэтому цвета кажутся не такими, как вы ожидаете.

person Adnan    schedule 15.01.2012

Просто упомянем об этом - если вы хотите использовать байты для цветов, используйте:

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

(GL_TRUE вместо GL_FALSE) см. Методы работы с данные вершин

person Martin Gerhardy    schedule 02.04.2015

Вы обнаружите, что ваша логика стала чище, если вы определяете данные вершин и элементов через вложенные массивы:

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%2, в котором, кстати, вы, вероятно, найдете ошибку. Вы увеличиваете индекс цвета после первой грани (i в этой точке все еще равно нулю, поэтому i%2 == 0), поэтому второй треугольник верхней грани получает цвет, отличный от первого; такая же проблема будет возникать для всех лиц.

person Marcelo Cantos    schedule 07.04.2011
comment
Мне нравится это. Я внес изменения, но теперь он весь синий, за исключением одного черного треугольника: '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++;) - person user617123; 08.04.2011

Вы должны включить DEPTH_TEST на вашем движке, иначе последовательность отрисовки вершин переопределит логическую Z DEPTH, которую вы ожидаете увидеть. Очень очень распространенная начальная ошибка.

Попробуйте включить сразу после очистки буфера цвета и глубины.

glEnable(GL_DEPTH_TEST);

Ваше здоровье

person Maurizio Benedetti    schedule 16.01.2012