У меня есть рабочая программа, которая отображает сетку ландшафта, созданную с карты высоты. Я хочу использовать спецификатор макета для объявления атрибутов вершин, но у меня возникают проблемы. Когда я просто использую встроенный gl_Normal для моих нормалей, все работает нормально. Когда я использую обычный объявленный с квалификатором макета, он не работает. Вершины отображаются отлично. Я не уверен, что я здесь делаю неправильно.glsl layout with glvertexattribpointer issues
Вот поколение буферов:
glGenBuffers(1, &TerrainPVBO);
glBindBuffer(GL_ARRAY_BUFFER, TerrainPVBO);
glBufferData(GL_ARRAY_BUFFER, Terrains[IID].Points.size() * sizeof(vec3f), &Terrains[IID].Points[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glGenBuffers(1, &TerrainNVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, TerrainNVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, Terrains[IID].Normals.size() * sizeof(vec3f), &Terrains[IID].Normals[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
Тогда в моей функции визуализации:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, TerrainIVBO);
glPatchParameteri(GL_PATCH_VERTICES, 3);
glDrawElements(GL_PATCHES, Terrains[IID].Index.size(), GL_UNSIGNED_INT, 0);
Если я не использую The VertexAttribArray/Pointer, и я использую glVertexPointer/glNormalPointer в функция рисования (с gl_Normal/gl_Vertex в шейдере), все работает нормально.
Это шейдер, если это помогает на всех:
#version 420
uniform mat3 NormalMatrix;
layout (location = 0) in vec4 vertex;
layout (location = 1) in vec3 normal;
out gl_PerVertex{
vec4 gl_Position;
};
out vec3 normalTCS;
void main()
{
gl_Position = vertex;
normalTCS = NormalMatrix * normal;
}
Я уверен, что я делаю что-то глупое, но я нашел этот процесс немного запутанным. Любая помощь будет принята с благодарностью!
Я ЗНАЛ, Я делал что-то глупое. Мои нормали, похоже, не те, что были раньше, но они кажутся точными. Проблема с тем, что элемент element_array был создан только при преобразовании в этот метод. Вот почему он работал раньше. Ура! – Vanic