Рендеринг из VBO с glDrawElements имеет странный результат

Я только начал реализовывать librocket (пользовательский интерфейс, который генерирует сетку из HTML), одним из требований является RenderInterface, Библиотека в основном отправляет ваш класс, который наследует от RenderInterface сгенерированная сетка и хочет, чтобы вы сохранили сетку, затем она хочет, чтобы вы визуализировали эту сгенерированную сетку. Звучит хорошо, так как у вас есть возможность реализовать собственную систему рендеринга для сторонней библиотеки. Однако моя проблема, вероятно, не имеет ничего общего с библиотекой.

Как я уже сказал, библиотека отправляет сетку моему классу:

GLuint m_BufferID[2];
//...
glGenBuffers(2, m_BufferID);
//..
glBindBuffer(GL_ARRAY_BUFFER, m_BufferID[0]);
glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_BufferID[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);

Это в основном происходит, когда Lib посылает мне меш. На самом деле он также загружает текстуру и т. Д., Но в данный момент это не важно. (ПРИМЕЧАНИЕ: данные - это указатель на массив ROCKET_LIB::Vertex)

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(ROCKET_CORE::Vertex), (GLvoid*)offsetof(Rocket::Core::Vertex, position)); 
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ROCKET_CORE::Vertex), (GLvoid*)offsetof(Rocket::Core::Vertex, colour));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(ROCKET_CORE::Vertex), (GLvoid*)offsetof(Rocket::Core::Vertex, tex_coord)); 

glUniformMatrix4fv(0, 1, GL_FALSE, &m_TransMatrix[0][0]); 
glUniform2f(1, translation.x, translation.y);

glActiveTexture(GL_TEXTURE0);

glBindBuffer(GL_ARRAY_BUFFER, m_BufferID[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_BufferID[1]);

glDrawElements(GL_TRIANGLES, m_indices_count, GL_UNSIGNED_INT, NULL);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);

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

Вершинный шейдер:

#version 330

layout(location = 0) in vec2 inPosition;
layout(location = 1) in vec4 inColor;
layout(location = 2) in vec2 inTexCoord;

out vec4 fragColor;
out vec2 fragTexCoord;

layout(location = 0) uniform mat4 m_Ortho;
layout(location = 1) uniform vec2 m_Translation;


void main()
{
    // Setting out values
    fragColor = inColor;
    fragTexCoord = inTexCoord;

    // Settings transformed position
    gl_Position = vec4(inPosition + m_Translation, 1.0f, 1.0f) * m_Ortho;
}

Фрагмент шейдера:

#version 330

in vec4 fragColor;
in vec2 fragTexCoord;

out vec4 outColor;

layout (location = 2) uniform sampler2D m_TextureSampler;

void main()
{
    // Just for testing purpose show the text coord as color
    outColor = vec4(fragTexCoord, 0.0f, 1.0f);
}

Ох, и я просто сгенерировать матрицу с:

glm::ortho(0.0f, static_cast<float>(m_Width), static_cast<float>(m_Height), 0.0f, -1.0f, 1.0f);

Из DirectX я узнал, что вы должны транспонировать матрицы, и я также попробовал это в opengl, но в итоге оба результата были странными. Вот скриншоты, которые показывают, что что-то определенно не так. (Каркас активирован)введите описание изображения здесь

1 ответ

Решение

Я не могу сказать, что это, безусловно, ваша актуальная проблема, но это проблема:

#version 330

layout(location = 0) uniform mat4 m_Ortho;
layout(location = 1) uniform vec2 m_Translation;

Эти две вещи не идут вместе. Явное назначение одинаковых местоположений является особенностью OpenGL 4.3. И версия 3.30 GLSL соответствует OpenGL 3.3.

Теперь, возможно, драйверы с поддержкой 3.3 предоставят эту возможность. Но это будет выставлено как продолжение. Поэтому вам нужно активировать его как расширение:

#version 330
#extension ARB_explicit_uniform_location : require

Очевидно, что такие шейдеры будут компилироваться, только если это расширение доступно.

Другие вопросы по тегам