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矩阵。
更多相关阅读:
OpenGL ES for Android
OpenGL ES 环境搭建
OpenGL ES 之uniform和varying相关推荐
- OpenGL ES 三种变量类型(uniform,attribute和varying)
https://blog.csdn.net/jackers679/article/details/6848085 https://zhuanlan.zhihu.com/p/103687720 1.un ...
- OpenGL ES 3.0之Uniform详解
Uniform是变量类型的一种修饰符,是OpenGL ES 中被着色器中的常量值,使用存储各种着色器需要的数据,例如:转换矩阵.光照参数或者颜色. uniform 的空间被顶点着色器和片段着色器分享 ...
- All about OpenGL ES 2.x – (part 2/3)(转载)
来源: http://db-in.com/blog/2011/02/all-about-opengl-es-2-x-part-23/ Very welcome back, my friends! No ...
- OpenGL ES着色器语言之变量和数据类型
所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符.变量在声明的时候首先要标明类型,后边可以跟多个变量,之间用逗号隔开.很多情 ...
- OpenGL ES 3.0 基础知识
首先要了解OpenGL的图形管线有哪些内容,再分别去了解其中的相关的关系: 管线分别包括了顶点缓冲区/数组对象,定点着色器,纹理,片段着色器,变换反馈,图元装配,光栅化,逐片段操作,帧缓冲区.其中顶点 ...
- OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)...
OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...
- 在Android中使用OpenGL ES开发第(五)节:GLSL基础语法
一.前期基础储备 笔者之前的四篇文综述了Android中使用OpenGL ES绘制基本图形和实现了简单的相机预览,初次接触OpenGL ES开发的读者可能对其中新的概念比较迷惑,尤其是其中的顶点着色器 ...
- 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)
在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...
- android 视频播放滤镜,用openGL ES+MediaPlayer 渲染播放视频+滤镜效果
之前曾经写过用SurfaceView,TextureView+MediaPlayer 播放视频,和 ffmpeg avi解码后SurfaceView播放视频,今天再给大家来一篇openGL ES+Me ...
- 【Qt for Android】OpenGL ES 绘制彩色立方体
Qt 内置对OpenGL ES的支持.选用Qt进行OpenGL ES的开发是很方便的,很多辅助类都已经具备.从Qt 5.0開始添加了一个QWindow类,该类既能够使用OpenGL绘制3D图形,也能够 ...
最新文章
- Latex使用简单总结
- UESTC 2015dp专题 E 菲波拉契数制 dp
- ssh mysql环境搭建_搭建一个MySQL高可用架构集群环境
- Gym - 101246D 博弈
- data.frame 转化为数值型_DataFrame(3):DataFrame的创建方式
- 调试js 试用火狐的firebug
- CVPR 2020丨微软亚洲研究院精选论文一览
- 好家伙!京东数科申请“测谎器”专利
- 找回 linux root密码的几种方法
- 用SQL Server 2017图形数据库替换数据仓库中的桥表
- 用Rstudio进行ARIMA模型预测(小白系列)
- 如何管理软件测试环境
- 你好,放大器——输入偏置电流(Input bias current,Iв)
- 猫怎么设置虚拟服务器,光纤猫设置虚拟服务器
- 使用PPT画图,取消自动选点(自动吸附点)解决方案
- java ini_Java读取ini文件 [org.dtools.javaini] | 学步园
- 树莓派做网络代理_树莓派使用Proxy代理
- 产品分析————拼多多
- android工具类
- C++中继承 —— 继承的概念及定义
热门文章
- 世界卫生组织健康标准
- 基于Linux的FTP文件传输项目(类似百度云)
- delphi学习笔记(1)-object pascal语言的数据类型 选择自 xmz2629 的 Blog
- 自然语言处理概述 NLP基本流程
- 【7集iCore3基础视频】7-5 iTool2驱动安装
- 一个555振荡电路及其解释
- python里的非_python中或与非
- 商汤AR开发之旅(1)-- 关于SenseAR SDK
- 【机器学习-白板推导系列】学习笔记---支持向量机和主成分分析法
- git报错 fatal: unsafe repository 解决方法 xxx is owned by someone else