glDrawElements () неверная запись размера 4 - PullRequest
0 голосов
/ 08 июля 2019

Итак, я рисую некоторый текст, используя C и OpenGL, он работает действительно хорошо, но я обнаружил некоторые проблемы при поиске утечек памяти с помощью Valgrind.

Вот мой код:

void draw_text(
    const char* text,
    float x,
    float y,
    float z,
    float r,
    float g,
    float b,
    float size,
    float spacing,
    state_T* state
)
{
    float d_r = r / 255.0f;
    float d_g = g / 255.0f;
    float d_b = b / 255.0f;

    float vertices[] = 
    {
        // positions          // colors           // texture coords
        size,  size, 0.0f,   d_r, d_g, d_b,   1.0f, 1.0f,   // top right
        size, -size, 0.0f,   d_r, d_g, d_b,   1.0f, 0.0f,   // bottom right
        -size, -size, 0.0f,   d_r, d_g, d_b,   0.0f, 0.0f,   // bottom left
        -size,  size, 0.0f,   d_r, d_g, d_b,   0.0f, 1.0f    // top left
    };

    unsigned int indices [] =
    {
        0, 1, 3,   // first triangle
        1, 2, 3    // second triangle
    };

    glBindVertexArray(state->VAO);
    glUseProgram(SHADER_TEXTURED);
    send_projection_view_state(SHADER_TEXTURED, state->camera->projection_view);

    unsigned int VBO;
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    for (int i = 0; i < strlen(text); i++)
    {
        char c = text[i];

        unsigned int EBO;

        glGenBuffers(1, &EBO);

        mat4 model =
        {
            1, 0, 0, 0,
            0, 1, 0, 0,
            0, 0, 1, 0,
            0, 0, 0, 1
        };

        glm_translate(model, (vec3){x, y, z});

        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

        // position attribute
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
        glEnableVertexAttribArray(0);
        // color attribute
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3* sizeof(float)));
        glEnableVertexAttribArray(1);

        // texcoords
        glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
        glEnableVertexAttribArray(2);

        glActiveTexture(GL_TEXTURE0);
        //unsigned int tex = get_char_texture_from_texture(c, 7, 7, 8, 12, TEXTURE_DEFAULT_FONT);
        unsigned int tex = get_char_texture_from_texture(c, 8, 8, 16, 16, TEXTURE_LN_EGA8x8_FONT);
        glBindTexture(GL_TEXTURE_2D, tex);
        glUniform1i(glGetUniformLocation(SHADER_TEXTURED, "ourTexture"), 0); 
        glBindVertexArray(state->VAO);

        unsigned uniform_mat4_model = glGetUniformLocation(SHADER_TEXTURED, "model");
        glm_translate(model, (vec3){(i * (size + spacing)), 0, 0});
        glUniformMatrix4fv(uniform_mat4_model, 1, GL_FALSE, (float *) model);

        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
        glDeleteBuffers(1, &EBO);
        glDeleteTextures(1, &tex);
    }

    glDeleteBuffers(1, &VBO);
    glBindVertexArray(0); 
}

Теперь, valgrind говорит мне, что здесь «неправильная запись размером 4» в строке, где я вызываю glDrawElements.

Вот точный вывод valgrind:

==29044== Invalid write of size 4
==29044==    at 0x7385901: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==29044==    by 0x7390B8F: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==29044==    by 0x737E8FB: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==29044==    by 0x75BD48D: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==29044==    by 0x75BE1A6: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==29044==    by 0x10FE07: draw_text (draw_utils.c:365)

Как мне решить эту проблему?

Я попытался поиграться с аргументами вызова glDrawElements, но без какого-либо решения проблемы.

Примечания: get_char_texture_from_texture просто "режет"Выделение символа из шрифта таблицы спрайтов, который я использую, и привязка его к текстуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...