OpenGL核心理解:Uniform
2020-02-02 11:45
1871 查看
简介:
着色器的变量主要包含如下:
- 顶点属性(Vertex Attributes): 顶点着色器:输入
-
所有着色器:输入
-
片段着色器:输入
-
顶点着色器:输出
这里我们要介绍的是统一变量
一. Uniform 是什么
统一变量是着色器程序(Program)特定的变量,在整个着色器程序的执行过程中(单次渲染:各种着色器),和多个物体执行中(多次渲染),都可以访问并可以保持一致(如果不主动设置,如多个物体的渲染中光源属性)。之所以叫统一,主要区别于其他变量:
- 顶点属性:仅顶点着色器可以访问,每次渲染数据基本不同(每物体顶点不同)
- Varying Variables:由顶点着色器创建,输出到片段着色器,每片段着色器不同
- 采样器:属于 Uniform
二. Uniform 有什么作用
统一变量主要用于为各种渲染类型(着色器)提供控制与输入
- 控制 开关:用于切换功能开启。比如gamma矫正,模糊效果的开关。。。
- 摄像机: 用于控制镜头。比如模型,视图,投影矩阵。。。
-
材质:用于表达材质的属性。比如粗糙度,金属度。。。
三. 什么时候使用?
一般在场景的初始时需要使用uniform,用于光源设置。更新时需要设置的情况如下:
- 操作摄像机时
- 渲染物体,或动态材质变化时
- 动态光源变化时
四. 如何使用?
- 单项设置
-
获取位置:单项设置需要在着色器程序(Program)编译后,根据着色器中的变量名称获取相应位置,使用函数 glGetUniformLocation
- 同步数据(内存->显存):根据获取的位置,按照数据类型同步数据,使用函数 glUniform*,如 glUniform1f
- 批量同步(使用 统一变量块:Uniform Block)
-
获取位置:需要在着色器程序(Program)编译后,根据 统一变量块 在着色器中的名称获取索引,使用函数 glGetUniformBlockIndex
- 绑定到统一变量缓冲(类似于顶点缓冲,是显存中的一块数据),使用函数 glUniformBlockBinding 将着色器的 统一变量块 绑定到指定序号的统一变量缓冲中
- 同步数据:这里区别于单项设置,是将数据同步到缓冲中。由于是绑定,可以多个着色器绑定到同一缓冲中,所以只需要操作一次,并且可以整块数据同步。使用函数 glBufferSubData
五. 实例
- 单项设置
-
先在着色器中添加变量
uniform mat4 project;
- 根据添加的名称在代码中获取位置, program 是已编译的着色器程序
int32_t location = glGetUniformLocation(program, "project");
- 同步数据,这里使用了 glm 库
glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(project));
GLint BlockAlienment = 0; glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &BlockAlienment);
-
Opengl教程
该项目需要使用 premake 生成VS项目, 如果不了解可以看下前文链接
参考手册:OpenGL 官方手册
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- OpenGL核心技术之帧缓冲
- OpenGL核心概念扫盲--学不懂OpenGL的进
- OpenGl的glMatrixMode()函数理解
- iOS开发CoreGraphics核心图形框架之二——深入理解图形上下文
- OpenGL 核心技术之立方体贴图
- 如何理解OpenGL光栅化
- OpenGL模型变换中局部坐标系和全局坐标系的理解
- 十分钟带你理解Kubernetes核心概念
- OpenGL核心技术之GPU编程
- OpenGL核心技术之抗锯齿
- jdbc,hibernate,spring的核心理解
- 关于Java核心技术书中的代码点和代码单元是怎么理解的呢?
- OpenGL中各种坐标系的理解[转]
- 理解核心态和用户态
- OpenGL核心技术之Shadow Mapping
- 谈谈我理解的软件测试的核心价值
- elasticsearch核心知识--26.一致性原理以及quorum机制理解
- “多态性”是C++最关键和核心的一个特性,“动态绑定技术”是C++编译器最重要的一个技术!欢迎C++高手进来指正我的粗浅理解
- opengl微发展理解
- 关于opengl的理解 2011-11-9