2013-12-11 77 views
0

我和我的一個朋友正在做一些3d編程,我們正試圖擺脫一個問題。我們正試圖訪問頂點着色器中燈光位置的制服,但未找到。OpenGL無法找到第二個制服的glGetUniformLocation制服

下面是一些代碼:

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

rotationLoc = glGetUniformLocation(program,"vRotationMatrix"); 
if(rotationLoc != -1) 
    glUniformMatrix4fv(rotationLoc,1,GL_TRUE,&world.rotationMatrix[0][0]); 

LightLoc = glGetUniformLocation(program, "vLightPos"); 
if (LightLoc != -1) 
    glUniform3fv(LightLoc, 1, LightPos); 

正如你可以看到我們做同樣的事情對我們的旋轉矩陣第一。它適用於旋轉矩陣,而不適用於LightLoc。 錯誤行是:LightLoc = glGetUniformLocation(program,「vLightPos」); LightLoc返回-1,但它應該返回2.

我們的頂點着色器的外觀(部分)如下:

uniform mat4 vRotationMatrix; 
uniform vec3 vLightPos; 
void main() 
{ 
    color = vColor; 
    oTexCoord = vTexCoord; 
    gl_Position = vRotationMatrix * vPosition; 
    lightPos = vLightPos; 
} 
+1

lightPos的定義是什麼? – Bahbar

+0

我們根據以下定義lightPost: out vec3 lightPos 在頂點着色器中。 –

+0

後來被覆蓋?在正確拼寫的制服上有-1的通常原因是它已經被優化(通常通過去除死碼)。 – Bahbar

回答

0

嘗試使用輸出下的評論檢查頂點代碼着色器編譯的結果着色器:

GLint Result = GL_FALSE; 
int InfoLogLength; 



// Compile Vertex Shader 
printf("Compiling shader : %s\n", vertex_file_path); 
char const * VertexSourcePointer = VertexShaderCode.c_str(); 
glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL); 
glCompileShader(VertexShaderID); 

// Check Vertex Shader 
glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); 
glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); 
if (InfoLogLength > 0){ 
    std::vector<char> VertexShaderErrorMessage(InfoLogLength+1); 
    glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); 
    printf("%s\n", &VertexShaderErrorMessage[0]); 
} 

也許有任何警告或錯誤。 您可以使用相同的片段着色器編譯

相關問題