2017-05-27 66 views
0

我正在學習使用GLUT和GLEW庫的OpenGL。 但我有一個關於在程序的片段着色器中設置統一值的問題。將統一值設置爲片段着色器(OpenGL)

以下是片段着色器代碼的一部分。

#version 110 
uniform vec4 cameraPosition; 
uniform vec4 lightPosition; 

varying vec4 fragColor; 
varying vec4 fragNormal; 
varying vec4 fragPosition; 

void main() { 
    vec4 L = lightPosition - fragPosition; 
    vec4 V = cameraPosition - fragPosition; 

我想要做的是設置'cameraPosition'和'lightPosition'統一變量。 另外,在主程序中,我放了一些代碼來獲取這些變量ID並將一些值傳遞給下面的變量。

GLuint cameraPositionID = glGetUniformLocation(programID, "cameraPosition"); 
GLuint lightPositionID = glGetUniformLocation(programID, "lightPosition"); 
GLfloat camPos[4] = { 1, 1, -3, 1 }; 
GLfloat lightPos[4] = { 1, 0, 0, 1 }; 
glUniform4fv(cameraPositionID, 4, &cameraPos[0]); 
glUniform4fv(lightPositionID, 4, &lightPos[0]); 

因此,我嘗試將camPos傳遞到cameraPosition,並將lightPos轉換爲lightPosition。 它正確或不正確?如果你認爲不正確,你有什麼想法嗎?

回答

2

glUniform4fvcount參數表示要設置的統一陣列的數量 - 在此情況下,有多少個vec4 s。你沒有數組,所以count必須是一個。根據規範,你的命令應該導致GL_INVALID_OPERATION錯誤,而不是設置任何統一值。 (除此之外,使用計數4也會從內存中讀取16個浮點數,而您的數組只有4個浮點數)。

在嘗試設置這些制服之前,您是否還做過glUspeProgram(programID)也不清楚。由於制服是每個程序狀態,因此glUniform*()命令僅適用於當前綁定的程序。

+0

好吧,現在清楚了,我把1放入count後,而不是4.非常感謝:) D:D – xpathz

相關問題