Uniform在着色器程序运行期间保持不变的全局变量(由CPU设置),用于从应用程序向着色器(Vertex/Fragment等)传递数据。

Uniform

GLSL中声明

GLSL
layout (location = 0) uniform mat4 uProjectionMatrix;
layout (location = 1) uniform vec3 uLightPosition;
layout (location = 2) uniform float uBrightness;
点击展开查看更多

获取位置

手动获取

若Uniform在声明时,显示声明了layout (location=x),那么location值便是该Uniform的位置。

根据Uniform名获取

C
GLint glGetUniformLocation(GLuint program, const GLchar *name);
点击展开查看更多
CPP
// 获取Uniform位置(在渲染循环外获取更高效)
GLint projLoc = glGetUniformLocation(shaderProgram, "uProjectionMatrix"); // 返回 0
GLint lightLoc = glGetUniformLocation(shaderProgram, "uLightPosition"); // 返回 1
GLint brightLoc = glGetUniformLocation(shaderProgram, "uBrightness"); // 返回 2
点击展开查看更多

传递数据

值传递

C
void glUniformXX (GLint location, ...)
点击展开查看更多

指针传递(Uniform数组)

C
void glUniformXXV (
	GLint location,
	GLsizei count,
	const GLfloat *value
)
点击展开查看更多

矩阵传递

C
void glUniformMatrixXXV (
	GLint location,
	GLsizei count,
	GLboolean transpose,
	const GLfloat *value
)
点击展开查看更多

示例

CPP
glUseProgram(shaderProgram); // 先激活着色器程序

// 传递矩阵(4x4)
glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projectionMatrix)); 

// 传递3维向量
glUniform3f(lightLoc, 1.0f, 2.0f, 3.0f); 

// 传递浮点数
glUniform1f(brightLoc, 0.8f); 
点击展开查看更多

常见数据类型和上传函数

GLSL 类型 对应 OpenGL 上传函数
float glUniform1f
vec2 glUniform2f / glUniform2fv
vec3 glUniform3f / glUniform3fv
vec4 glUniform4f / glUniform4fv
int glUniform1i
sampler2D glUniform1i(传入纹理单元编号)
mat4 glUniformMatrix4fv

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/uniform%E6%95%B0%E6%8D%AE%E4%BC%A0%E9%80%92/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键