2015-05-02 43 views
0

所以我有一個工作程序,顯示從高度地圖生成的地形網格。我想現在使用佈局限定符來聲明頂點屬性,但是我遇到了問題。當我只使用內置的gl_Normal作爲我的法線時,一切正常。當我使用佈局限定符聲明的普通函數時,它不起作用。無論如何,頂點顯示都很好。我不確定我在這裏做錯了什麼。glsl佈局與glvertexattribpointer問題

這裏是緩衝區的產生:在

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, TerrainIVBO); 
glPatchParameteri(GL_PATCH_VERTICES, 3); 
glDrawElements(GL_PATCHES, Terrains[IID].Index.size(), GL_UNSIGNED_INT, 0); 

如果我不使用VertexAttribArray /指針,我用glVertexPointer/glNormalPointer:

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); 

然後倒在我的渲染功能繪圖函數(在着色器中使用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,因此您將您的noramls設置爲與您的位置相同。

但是,glNormalPointer()的工作原理是相同的,所以我很難理解這可能是如何工作的。

+0

我知道我在做一些愚蠢的事情。我的法線似乎與以前不一樣,但它們似乎確實是準確的。它是element_array的問題僅在我轉換爲此方法時才創建。這就是之前的原因。乾杯! – Vanic