【问题标题】:Setting uniform values into the fragment shader (OpenGL)将统一值设置到片段着色器 (OpenGL)
【发布时间】:2017-05-27 20:04:22
【问题描述】:

我正在使用 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。 它是正确的还是不正确的?如果您认为不正确,您对此有什么想法吗?

【问题讨论】:

    标签: opengl


    【解决方案1】:

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

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

    【讨论】:

    • 好的,在我将 1 放入计数后,现在很清楚,而不是 4。非常感谢 :) :D:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    相关资源
    最近更新 更多