您正在使用OpenGL 2.1,因此您必須使用glGetAttribLocation()
來提取屬性索引。你不能只是希望GLSL編譯穿0
頂點和texcoords上2
:
void render(Shader* shader_program = NULL)
{
if (shader_program)
shader_program->bind();
GLint position_loc = glGetAttribLocation(shader_program->id(), "position");
GLint tex_loc = glGetAttribLocation(shader_program->id(), "tex");
GLint normal_loc = glGetAttribLocation(shader_program->id(), "normal");
glEnableVertexAttribArray(position_loc);
glEnableVertexAttribArray(normal_loc);
glEnableVertexAttribArray(tex_loc);
for (size_t i = 0; i < entries.size(); ++i)
{
glBindBuffer(GL_ARRAY_BUFFER, entries[i].vb);
// I think this tells it where to look for the vertex information we've loaded.
glVertexAttribPointer(position_loc, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(normal_loc, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12); // starts at 12 because 3 floats for position before 2 floats for normal
glVertexAttribPointer(tex_loc, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20); // makes room for 5 floats
...
你也可以告訴 OpenGL的情況下把他們(glBindAttribLocation()
)你鏈接您的着色器,但你有事情的方式之前,設置會讓這個有點麻煩。
在OpenGL 3.1+中,您可以強制編譯器通過layout
qualifier將特性放在特定索引上。
佈局限定符上的優點。如果你有一組使用一致佈局的着色器,你可以在你的C/C++代碼中創建一個枚舉,並且更直觀地引用這些屬性 – Jherico
呵呵。爲什麼着色器程序以不同於聲明方式的方式排序?這對我來說很不直觀。 –