2015-02-23 68 views
1

這是我的着色器 'triangles.vert':glGetAttribLocation()返回-1,但變量是統一的,如何解決它?

#version 430 core 
layout(location = 0) in vec4 vPosition; 
layout(location = 1) in vec4 vColor; 
uniform mat4 vRota; 

out vec4 color; 

void main() 
{ 
    color = vColor; 
    gl_Position = vRota * vPosition; 
} 

,這是C++源代碼的片段:

ShaderInfo shaders[] = 
{ 
    { GL_VERTEX_SHADER, "triangles.vert" }, 
    { GL_FRAGMENT_SHADER, "triangles.frag" }, 
    { GL_NONE, NULL } 
}; 

GLuint program = LoadShaders(shaders); 
glUseProgram(program); 

//... 

int vRota_loc = glGetAttribLocation(program, "vRota"); 

if (vRota_loc == -1) 
{ 
    cout << "No uniform match for 'vRota'" << endl; 
} 

返回-1,但我不知道爲什麼。

我在着色器中做錯了什麼?

ps LoadShaders()是編譯和鏈接着色器程序的函數。它是由我正在練習的一本書給出的源文件。所以我建議不會有錯誤。

回答

8

glGetAttribLocation用於頂點着色器中的頂點屬性,即in變量(例如vPosition)。你想要glGetUniformLocation

5

A uniform不是屬性。您需要使用glGetUniformLocation

A uniform對於每個頂點是一致的,而attribute是每個頂點。

+0

制服在每個着色器階段都可用,這使得它們與頂點屬性完全不同。它們是程序範圍內的常量。 – 2015-02-23 17:02:25

相關問題