OpenGL ES 之uniform和varying
老
孟
一个
有态度
的程序员
uniform
uniform是GLSL中变量类型的限定符,使用uniform限定的变量是只读值,在Shader中无法更改,只能通过应用程序传递给uniform。
uniform变量为全局共享变量,可以在所有的Shader中可以获取,uniform定义如下:
uniform float uTexPos;
uniform 变量通常是存储在GPU的”常量区”,这一区域的内存是有限的,因此uniform有个数限制,但比attribute要多很多,OpenGL 标准化组织规定OpenGL ES 2.0规定至少支持128个顶点uniform和16个片段(Fragment)uniform。
获取支持的顶点uniform最大个数代码如下:
fun getMaxVertexUniformNum(): Int {
var count = IntArray(1)
GLES20.glGetIntegerv(GLES20.GL_MAX_VERTEX_UNIFORM_VECTORS, count, 0)
return count[0]
}
获取支持的片段uniform最大个数代码如下:
fun getMaxFragmentUniformNum(): Int {
var count = IntArray(1)
GLES20.glGetIntegerv(GLES20.GL_MAX_FRAGMENT_UNIFORM_VECTORS, count, 0)
return count[0]
}
设置uniform变量值
获取uniform 属性的句柄代码如下:
GLES20.glGetUniformLocation(programHandle, uniformName)
programHandle代表program句柄,uniformName就是uniform属性的名称。
设置uniform值的方法在Android中比较多,代码如下:
GLES20.glUniform1f(location,x)
GLES20.glUniform2f(location,x,y)
GLES20.glUniform3f(location,x,y,z)
GLES20.glUniform4f(location,x,y,z,w)
设置float类型的数据,location表示uniform属性的句柄,后面x,y,z,w是值,参数中(x)/(x,y)/(x,y,z)/(x,y,z,w)分别对应vec2/vec3/vec4类型的uniform。
设置vec类型的变量也可以使用如下方法:
GLES20.glUniform2fv()
设置int类型数据使用如下方法:
GLES20.glUniform1i(location,x)
设置mat类型使用如下方法:
GLES20.glUniformMatrix2fv()
varying
varying是GLSL中限定符,varying限定的变量只能在shader之间传递,是Vertex Shader(顶点着色器)的输出,Fragment Shader(片段着色器)的输入,Shader中的声明和类型要保持一致。
varying定义格式如下:
varying float color;
在Vertex Shader中定义varying变量并设置为vec4(1,0,0,1),代码如下:
attribute vec4 vPosition;
varying vec4 color;
void main() {
color= vec4(1,0,0,1);
gl_Position = vPosition;
}
在Fragment Shader中获取color值并使用,代码如下:
precision mediump float;
varying vec4 color;
void main()
{
gl_FragColor = color;
}
与attribute和uniform一样,varying也有数量限制,OpenGL ES 2.0至少支持8个,获取varying的最大个数,代码如下:
fun getMaxSupportNum(): Int {
var count = IntArray(1)
GLES20.glGetIntegerv(GLES20.GL_MAX_VARYING_VECTORS, count, 0)
return count[0]
}
varying不仅有个数的限制,还有大小的限制,varying变量最多可以传递32个float数据,或者8个vec4,或者2个mat4矩阵。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python代码规范检测
- 详解Flask上下文
- C#逐行读取和写入文件
- 使用这些不太常用的 CSS 属性,让我在前端布局效率上,又提高了一个层次!
- CDN缓存的理解
- 二叉树的所有路径
- JavaScript 字符串中的 pad 方法!
- python随机生成经纬度(用于爬虫参数伪造)
- [Go]GO语言实战-gorm获取insert的自增id 和 struct标签不映射到表字段
- 安装vcs
- Mercari数据集——机器学习&深度学习视角
- 查找重复姓名的sql语句
- nginx如何限制并发连接请求数?
- RTSP协议视频平台EasyNVR证书配置界面上传文件地址自动填写错误怎么处理?
- 开发RTSP/RTMP/GB28181/海康SDK/EHome视频融合平台EasyCVR,使用vue-cli3项目搭建多页面模式的方法