2015-05-02 3 views
0

У меня есть рабочая программа, которая отображает сетку ландшафта, созданную с карты высоты. Я хочу использовать спецификатор макета для объявления атрибутов вершин, но у меня возникают проблемы. Когда я просто использую встроенный 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; 
} 

Я уверен, что я делаю что-то глупое, но я нашел этот процесс немного запутанным. Любая помощь будет принята с благодарностью!

ответ

0

Я не уверен, что такое ваш isse, но используя GL_ELEMENT_ARRAY_BUFFER для ваших нормалей не получится. Звонки glVertexAttribPointer() всегда будут ссылаться на текущий связанный GL_ARRAY_BUFFER, поэтому вы настроите свои норамлы одинаковыми с вашими позициями.

Тем не менее, glNormalPointer() работает одинаково, поэтому мне не совсем понятно, как это могло бы работать раньше.

+0

Я ЗНАЛ, Я делал что-то глупое. Мои нормали, похоже, не те, что были раньше, но они кажутся точными. Проблема с тем, что элемент element_array был создан только при преобразовании в этот метод. Вот почему он работал раньше. Ура! – Vanic