Должна ли работать эта многосеточная настройка glDrawElements или это ошибка проецирования? - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать код, который бы работал на GLESv2 / OpenGLv3.Это функция рисования ландшафта.Сетка даже не отображается в окне просмотра.Нет ошибок на OpenGLv3, подумал.И я пытаюсь быть обратно совместимым с GLESv2, чтобы VAO там не работал.И максимальный индекс, доступный в GLESv2, составляет 65536, поэтому я делю текстуру 512x512 на 4 части.Для glDrawElementsBaseVertex требуется GLESv3, поэтому я не могу его использовать.Я считаю, что указатель должен быть умножен на sizeof, остальные аргументы - нет.У меня есть вершины и нормальные координаты в VBO, так что это 6 поплавков, 3 для каждого.UV использует вершину xy.А у четверки 6 показателей.

void GLEntity::nouv_pointer(GLint vertex, GLint normal, GLint uv, uintptr_t offset) {
    uintptr_t offset_=offset*6;
    if(vertex!=-1) glVertexAttribPointer(
        vertex,                             // attribute
        3,                                  // number of elements per vertex, here (x, y, z)
        GL_FLOAT,                           // the type of each element
        GL_FALSE,                           // take our values as-is
        3*sizeof(GLfloat),                  // 3 extra data entries between each position
        (GLvoid*)(offset_*sizeof(GLfloat))  // offset of the first element
    );
    if(normal!=-1) glVertexAttribPointer(
        normal,                                // attribute
        3,                                     // number of elements per vertex, here (x, y, z)
        GL_FLOAT,                              // the type of each element
        GL_FALSE,                              // take our values as-is
        3*sizeof(GLfloat),                     // 3 extra data entries between each position
        (GLvoid*)((3+offset_)*sizeof(GLfloat)) // offset of the first element
    );
    if(uv!=-1)     glVertexAttribPointer(
        uv,                                // attribute
        2,                                 // number of elements per vertex, here (x, y, z)
        GL_FLOAT,                          // the type of each element
        GL_FALSE,                          // take our values as-is
        4*sizeof(GLfloat),                 // 4 extra data entries between each position
        (GLvoid*)(offset_*sizeof(GLfloat)) // offset of the first element
    );
}

void GLEntity::draw(GLint vertex, GLint normal, GLint uv) {
    if(placebo) {
        SDL_Log("Trying to draw uninitialized object\n");
        return;
    }
    glBindBuffer(GL_ARRAY_BUFFER, vtnBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
    if(vertex!=-1) glEnableVertexAttribArray(vertex);
    if(normal!=-1) glEnableVertexAttribArray(normal);
    if(uv!=-1)     glEnableVertexAttribArray(uv);
        uintptr_t basevertex=0;
        //nouv_pointer(vertex, normal, uv, 0);
        //glDrawArrays(GL_TRIANGLES, 0, x_top_block*y_top_block*65536);

    for(unsigned int y_block=0;y_block<y_top_block;y_block++) {
        for(unsigned int x_block=0;x_block<x_top_block;++x_block) {
            nouv_pointer(vertex, normal, uv, basevertex);
            glDrawElements(GL_TRIANGLES,
                           ibos_,
                           GL_UNSIGNED_SHORT,
                           (GLvoid*)0);
            basevertex+=65536;
        }
        basevertex+=last_block_size_x*y_bs;
    }
    basevertex=65536*x_top_block;
    for(unsigned int y_block=0;y_block<y_top_block;y_block++) {
        nouv_pointer(vertex, normal, uv, basevertex);
        glDrawElements(GL_TRIANGLES,
                       ibos_x,
                       GL_UNSIGNED_SHORT,
                       (GLvoid*)(ibos_*sizeof(GLushort)));
        basevertex+=65536*x_top_block+last_block_size_x;
    }
    basevertex=(65536*x_top_block+last_block_size_x)*y_top_block;
    for(unsigned int x_block=0;x_block<x_top_block;++x_block) {
        nouv_pointer(vertex, normal, uv, basevertex);
        glDrawElements(GL_TRIANGLES,
                       ibos_y,
                       GL_UNSIGNED_SHORT,
                       (GLvoid*)((ibos_+ibos_x)*sizeof(GLushort)));
        basevertex+=x_bs*last_block_size_y;
    }
    basevertex=(65536*x_top_block+last_block_size_x)*y_top_block+x_bs*last_block_size_y*x_top_block;
    nouv_pointer(vertex, normal, uv, basevertex);
    glDrawElements(GL_TRIANGLES,
                   ibos_xy,
                   GL_UNSIGNED_SHORT,
                   (GLvoid*)((ibos_+ibos_x+ibos_y)*sizeof(GLushort)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...