Невозможно рисовать треугольники через glDrawElements в OpenGL ES 2.0 - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь нарисовать процедурную сферу, на которую ссылается здесь .

Я немного ее изменил, чтобы можно было использовать метод glDrawElements из OpenGL ES 2.0

Вот моя версия createSphere:

GLfloat sphereVerticies[10000]={0.0};
GLubyte triangleIndices[15000]={0};

int createSphere (GLfloat spherePoints[], GLubyte triangleIndices[], GLfloat fRadius, GLfloat step)
{
    int points = 0;

    GLfloat uStep = DEGREES_TO_RADIANS (step);
    GLfloat vStep = uStep;

    unsigned long index=0;

    for (GLfloat u = 0.0f; u <= (2 * M_PI); u += uStep) 
    {
        for (GLfloat v = -M_PI_2; v <= M_PI_2; v += vStep) 
        {               
            triangleIndices[index++]=points;
            triangleIndices[index++]=points+1;
            triangleIndices[index++]=points+2;
            triangleIndices[index++]=points+2;
            triangleIndices[index++]=points+3;
            triangleIndices[index++]=points;

            points++;
            spherePoints[(points - 1) * 3] = fRadius * cosf(v) * cosf(u);             // x
            spherePoints[((points - 1) * 3) + 1] = fRadius * cosf(v) * sinf(u);       // y
            spherePoints[((points - 1) * 3) + 2] = fRadius * sinf(v);                 // z

            points++;
            spherePoints[(points - 1) * 3] = fRadius * cosf(v) * cosf(u + uStep);             // x
            spherePoints[((points - 1) * 3) + 1] = fRadius * cosf(v) * sinf(u + uStep);       // y
            spherePoints[((points - 1) * 3) + 2] = fRadius * sinf(v);                         // z              

            points++;
            spherePoints[(points - 1) * 3] = fRadius * cosf(v + vStep) * cosf(u);                  // x
            spherePoints[((points - 1) * 3) + 1] = fRadius * cosf(v + vStep) * sinf(u);            // y
            spherePoints[((points - 1) * 3) + 2] = fRadius * sinf(v + vStep);                      // z

            points++;
            spherePoints[(points - 1) * 3] = fRadius * cosf(v + vStep) * cosf(u + uStep);           // x
            spherePoints[((points - 1) * 3) + 1] = fRadius * cosf(v + vStep) * sinf(u + uStep);     // y
            spherePoints[((points - 1) * 3) + 2] = fRadius * sinf(v + vStep);                       // z

        }
    }        
    return points;
}

В SetupGL у меня есть:

..
glEnable(GL_CULL_FACE);
..
..
glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);

 numPoints=createSphere(sphereVerticies, triangleIndices, 30.0f, 20.0f);

    glGenBuffers(1, &_vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(sphereVerticies), sphereVerticies, GL_STATIC_DRAW);

    glGenBuffers(1, &_indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(triangleIndices), triangleIndices, GL_STATIC_DRAW);

    // New lines (were previously in draw)
    glEnableVertexAttribArray(GLKVertexAttribPosition);        
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) sphereVerticies);

glBindVertexArrayOES(0);

и, наконец, в drawInRect:

glBindVertexArrayOES(_vertexArray);   
    glDrawElements(GL_TRIANGLES, (int)(numPoints*1.5), GL_UNSIGNED_BYTE, 0);

Что я здесь не так делаю?Я не вижу визуального вывода.Любая помощь будет оценена.Спасибо.

1 Ответ

6 голосов
/ 19 марта 2012

Я вижу две вещи:

glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) sphereVerticies);

последний аргумент должен быть 0, так как вершины уже буферизованы и связаны в VBO.

OpenGL ES - документация glVertexAttribPointer

Если ненулевой именованный объект буфера привязан к цели GL_ARRAY_BUFFER (см. GlBindBuffer), в то время как указан универсальный массив атрибутов вершины, указатель обрабатывается как смещение байта в хранилище данных объекта буфера ...

И

glDrawElements(GL_TRIANGLES, (int)(numPoints*1.5), GL_UNSIGNED_BYTE, 0);

Вы должны использовать GL_UNSIGNED_SHORT, потому что у вас более 255 вершин.


Что касается индексов, то вот как вы их индексируете:

                 (0,1,2)        (2,3,0)
 2       3      2              2       3
 o-------o      o              o-------o
 |       |      | \            |     /
 |       |  =>  |   \          |   /
 |       |      |     \        | /
 o-------o      o-------o      o
 0       1      0       1      0

Итак, из этого графика мы видим две проблемы:

1) Треугольники не закрывают многоугольник

2) Обратите внимание на обмотку, первый треугольник - против часовой стрелки, второй - против часовой стрелки.

Попробуйте этот код:

        triangleIndices[index++]=points;
        triangleIndices[index++]=points+1;
        triangleIndices[index++]=points+2;
        triangleIndices[index++]=points+3;
        triangleIndices[index++]=points+2;
        triangleIndices[index++]=points+1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...