关于着色器程序的Uniform变量

⌚Time: 2025-03-15 11:11:00

👨‍💻Author: Jack Ge

在使用Uniform变量的时候程序提示变量未定义,原因是没有使用的变量被编译器优化掉了。当我直接在着色器程序修改Uniform变量的时候,他提示需要提供的不是左值变量,不可修改。

因为我不是很懂,我询问了deepseek关于Uniform变量的一些注意知识:


关于 Uniform 变量,以下是一些需要注意的关键知识点和最佳实践。这些内容可以帮助你更好地理解和使用 Uniform 变量,避免常见的错误和性能问题。


1. Uniform 变量的定义


2. Uniform 变量的生命周期


3. Uniform 变量的性能


4. Uniform 变量的查找

GLint location = glGetUniformLocation(shaderProgram, "vtime");
if (location == -1) {
    std::cerr << "Uniform 'vtime' not found!" << std::endl;
}

5. Uniform 变量的设置

glUseProgram(shaderProgram);
glUniform1f(location, 1.0f);

6. Uniform 变量的默认值


7. Uniform 变量的优化


8. Uniform 变量的调试


9. Uniform 变量的作用范围


10. Uniform 变量的常见用途


11. Uniform 变量的示例

顶点着色器

#version 330 core
layout(location = 0) in vec3 aPos;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main() {
    gl_Position = projection * view * model * vec4(aPos, 1.0);
}

片段着色器

#version 330 core
out vec4 FragColor;
uniform vec3 lightColor;

void main() {
    FragColor = vec4(lightColor, 1.0);
}

宿主程序(C++)

// 获取 Uniform 变量的位置
GLint modelLoc = glGetUniformLocation(shaderProgram, "model");
GLint viewLoc = glGetUniformLocation(shaderProgram, "view");
GLint projLoc = glGetUniformLocation(shaderProgram, "projection");
GLint lightColorLoc = glGetUniformLocation(shaderProgram, "lightColor");

// 设置 Uniform 变量的值
glUseProgram(shaderProgram);
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));
glUniform3f(lightColorLoc, 1.0f, 1.0f, 1.0f);

12. Uniform 变量的高级用法


总结