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

时间:2017-05-27 11:41:46

标签: 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 = 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。 是正确还是不正确?如果您认为不正确,您对此有任何想法吗?

1 个答案:

答案 0 :(得分:2)

count的{​​{1}}参数表示您要设置的统一数组的元素数 - 在这种情况下,glUniform4fv的数量。您没有数组,因此vec4必须是一个。根据规范,您的命令应该导致count错误,而不是设置任何统一值。 (除此之外,使用count 4还会从内存中读取16个浮点数,而你的数组只有4个浮点数。)

在你尝试设置这些制服之前,你是否做过GL_INVALID_OPERATION还不清楚。由于制服是按程序状态,glUspeProgram(programID)命令仅适用于当前绑定的程序。