在片段着色器(OpenGL)中设置统一值

在片段着色器(OpenGL)中设置统一值,opengl,Opengl,我正在用GLUT和GLEW库学习OpenGL。 但是我有一个关于在程序的片段着色器中设置统一值的问题 下面是片段着色器代码的一部分 #version 110 uniform vec4 cameraPosition; uniform vec4 lightPosition; varying vec4 fragColor; varying vec4 fragNormal; varying vec4 fragPosition; void main() { vec4 L = lightPos

我正在用GLUT和GLEW库学习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。
是对还是错?如果您认为不正确,您对此有什么想法吗?

glUniform4fv的
count
参数表示要设置一个统一数组的多少个元素,在这种情况下,是多少
vec4
s。您没有数组,因此
count
必须为1。根据规范,您的命令应导致
GL\u INVALID\u操作
错误,并且不会设置任何统一值。(除此之外,使用计数4还可以从内存中读取16个浮点,而数组只有4个浮点)


还不清楚您在设置这些制服之前是否执行了
glUspeProgram(programID)
。由于每个程序状态都是统一的,
glUniform*()
命令仅适用于当前绑定的程序。
glUniform4fv
count
参数表示要设置统一数组中的多少个元素,在本例中为多少
vec4
s。您没有数组,因此
count
必须为1。根据规范,您的命令应导致
GL\u INVALID\u操作
错误,并且不会设置任何统一值。(除此之外,使用计数4还可以从内存中读取16个浮点,而数组只有4个浮点)


还不清楚您在设置这些制服之前是否执行了
glUspeProgram(programID)
。由于制服是每个程序状态的,因此
glUniform*()
命令仅适用于当前绑定的程序。

好的,在我将1而不是4放入计数后,现在就清楚了。非常感谢:):D:Dokay,在我将1而不是4放入计数后,现在就清楚了。非常感谢