GLSL语言OpenGLES(三)
前言
前面讲解了glsl语言的基础,这里在继续学习一下opengl es经常用到的知识点,如下:
opengl es系列文章
opengl es之-基础概念(一)
opengl es之-GLSL语言(二)
opengl es之-GLSL语言(三)
opengl es之-常用函数介绍(四)
opengl es之-渲染两张图片(五)
opengl es之-在图片上添加对角线(六)
opengl es之-离屏渲染简介(七)
opengl es之-CVOpenGLESTextureCache介绍(八)
opengl es之-播放YUV文件(九)
1、变量类型
变量种类 | 变量类型 | 描述 |
---|---|---|
空 | void | 用于无返回值的函数或者参数为空的函数 |
标量 | float, int, bool | 浮点型,整型,布尔型的标量数据类型 |
浮点型向量 | vec2, vec3, vec4 | 包含2,3,4个元素的浮点型向量 |
整数型向量 | ivec2, ivec3, ivec4 | 包含2,3,4个元素的整型向量 |
布尔型向量 | bvec2, bvec3, bvec4 | 包含1,2,3,4个元素的布尔型 |
矩阵 | mat2, mat3, mat4 | 尺寸为2x2,3x3,4x4的浮点型矩阵 |
纹理句柄 | sampler2D, samplerCube | 分别表示操作2D和cube的句柄 |
备注:GLSL中没有指针类型,大小写敏感的
对于变量类型,GLSL有着非常严格的规则,进行赋值,加减乘除运算必须类型一直,否则会出现语法错误。如果不一致则必须进行强制类型转换
float myFloat = 1.0;
bool myBool = true;
float result = myFloat + myBool(myBool);
2、Structures 结构体
GLSL支持结构体,把一些系统定义的类型聚到一起,组成自定义的类型,也可以包括事先声明的结构体,但是不能定义嵌套结构体。例如:
struct myStruct
{float f1;bool f2;vec3 v3;
}
// 声明结构体变量
myStruct lightVar2;
struct myStruct2
{float f1;myStruct st1; //合法struct str2{ // 不合法bool b1;float f2;}
}
3、Arrays 数组
GLSL中的数组和C的数组很类似,支持最基本类型,也支持结构体的数组。例如:
float frequencies[3];
uniform vec4 lightPosition[4];
const int numLights = 2;
light lights[numLights];
//备注 GLSL的数组无法在声明的时候初始化。
4、存储限定符
const 常量,或者是函数的只读参数
attribute 只能在顶点着色器中定义,只读属性,由应用程序赋值初始化
uniform 只能定义为全局变量,只读属性,可以由应用程序和opengl 初始化
varying 提供顶点着色器和片段着色器的连接点,只能是float, vec2, vec3, vec4, mat2, mat3, and mat4类型的变量
5、vector变量操作方式
向量的元素有固定的名字去访问,分别有三组{x,y,z,w}、{r,g,b,a}、{s,t,p,q},访问时下表对应长度不能超过l向量的长度
vec2 v = vec2(3.0);
v.x //正确
v.z // 错误
// 向量的元素可以放在一起
vec4 v = vec4(1,2,3,4);
v.zy // 等于 vec2(3,2)
vec3 v3 = v.xyz // 等于vec3(1,2,3)
v.rgba // 此种方式不正确,下表同时只能使用一个集合中的名称
v.yx = vec2(3,0) // 将y和x的位置互换并给他们的赋值为新的值,将变成 vec4(3,0,3,4);
6、矩阵元素的操作方式
// 用[]访问元素
mat4 m;
m[1] = vec4(2.0); // sets the 4th element of the third column to 2.0
m[0][0] = 1.0; // sets the upper left element to 1.0
m[2][3] = 2.0; // sets the second column to all 2.0
7、向量和矩阵的操作
vec3 v, u; float f;
v = u + f;
等价于
v.x = u.x + f;
v.y = u.y + f;
v.z = u.z + f;
vec3 v, u, w;
w = v + u;
等价于
w.x = v.x + u.x;
w.y = v.y + u.y;
w.z = v.z + u.z;
vec3 v, u;
mat3 m;
u = v * m;
等价于
u.x = dot(v, m[0]);
u.y = dot(v, m[1]);
u.z = dot(v, m[2]);
u = m * v;
等价于
u.x = m[0].x * v.x + m[1].x * v.y + m[2].x * v.z; u.y = m[0].y * v.x + m[1].y * v.y + m[2].y * v.z; u.z = m[0].z * v.x + m[1].z * v.y + m[2].z * v.z;
mat m, n, r;
r = m * n;
等价于
r[0].x = m[0].x * n[0].x + m[1].x * n[0].y + m[2].x * n[0].z;
r[1].x = m[0].x * n[1].x + m[1].x * n[0].y + m[2].y * n[0].z;
r[2].x = m[0].x * n[2].x + m[1].x * n[0].y + m[2].z * n[0].z;
r[0].y = m[0].y * n[0].x + m[1].y * n[1].y + m[2].x * n[1].z;
r[1].y = m[0].y * n[1].x + m[1].y * n[1].y + m[2].y * n[1].z;
r[2].y = m[0].y * n[2].x + m[1].y * n[1].y + m[2].z * n[1].z;
r[0].z = m[0].z * n[0].x + m[1].z * n[2].y + m[2].x * n[2].z;
r[1].z = m[0].z * n[1].x + m[1].z * n[2].y + m[2].y * n[2].z;
r[2].z = m[0].z * n[2].x + m[1].z * n[2].y + m[2].z * n[2].z;
8、常用内置函数
备注:如下函数的参数如果不做特殊说明 适用于所有数据类型
mix()函数:
功能:像素混合
定义:mix(x,y,a)
公式:x ∗ (1 – a) + y ∗ adot()函数:
功能:计算两个元素的乘积
定义:dot(x,y)
公式:x[0] * y[0] + x[1] * y[1] + .......atan()函数:
功能:求反正切值
定义:atan (y, x)或者atan (y/x)
区别:atan (y, x)与atan (y/x)的区别,前者的返回值范围是[-π,π],表示点(x,y)和原点与x轴的夹角;后者为[-π/2,π/2],表示根据数字求出正切角度sqrt()函数:
功能:求平方根
定义:sqrt(x,y)
公式:sin()函数:
功能:求角度的正弦值
定义:sin(x)cos()函数:
功能:求角度的余弦值
定义:cos(x)clamp()函数:
功能:给定一个范围[minval,maxval],如果x在这个范围内,则返回x,否则返回接近边界的minval或者maxval
定义:clamp(x,minVal,maxVal),参数类型为整数和浮点数
公式:等价于min (max (x, minVal), maxVal)mod()函数
功能:求两个数相除的余数
定义:mod(x,y),这里x和y可以是普通的数也可以是矩阵
公式:
GLSL语言OpenGLES(三)相关推荐
- OpenGL ES之Swift使用GLSL语言渲染图片的显示
整体思路 一.GLSL和iOS 本片主要使用编译链接自定义的shader(顶点着色器/片元着色器).用简单的GLSL语言来实现顶点.片元着色器,并对图形进行简单的变换. OpenGL ES只是用来做渲 ...
- 学习和在生产环节使用d语言的三个条件
2019独角兽企业重金招聘Python工程师标准>>> 其他主流语言不说,因为我们遇到的问题,差不多都有人遇到了,很容易找到解决方案. 而d语言呢,目前连招d语言程序猿的公司都没有哦 ...
- 大学c语言第三章作业,华中科技大学光电子学院C语言第三章
<华中科技大学光电子学院C语言第三章>由会员分享,可在线阅读,更多相关<华中科技大学光电子学院C语言第三章(20页珍藏版)>请在装配图网上搜索. 1.第三章 简单程序设计 1. ...
- [GO语言基础] 三.变量声明、数据类型、标识符及编程练习12题
作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了Go的编译运行 ...
- 嵌入式linux面试题解析(二)——C语言部分三
嵌入式linux面试题解析(二)--C语言部分三 1.下面的程序会出现什么结果 #include <stdio.h> #include <stdlib.h> #include ...
- 循环队列及C语言实现三
在之前的博客中给出了设计循环队列的思路以及源码,这些可都是经过我长期大数据测试的验证哦.当然,现在的很多开源项目和一些封装好的类或接口也都有类似的队列实现方法,之所以我还在使用自己写的这一套方法,主要 ...
- c语言改变doss窗口的颜色,C语言第三次模拟练习题部分解答
<C语言第三次模拟练习题部分解答>由会员分享,可在线阅读,更多相关<C语言第三次模拟练习题部分解答(20页珍藏版)>请在装配图网上搜索. 1.单项选择1. 题号:13334若有 ...
- 嵌入式linux面试题库,嵌入式linux面试题解析(二)——C语言部分三
嵌入式linux面试题解析(二)--C语言部分三 1.下面的程序会出现什么结果#include#include #include void getmemory(char *p){p=(char *) ...
- c 语言比较三个整数大小,C 语言 —— 比较三个整数的大小并从大到小输出
思路一:定义两个比较大小的函数,依次两两比较输出最大或最小的数字(较为繁琐,最易分析) /* C 语言比较三个整数的大小并从大到小输出 思路:定义两个比较大小的函数,依次两两比较输出最大或最小的数字 ...
最新文章
- 关于make *.img时没有权限的问题
- Design Pattern----21.Behavioral.Memento.Pattern (Delphi Sample)
- 数据库系统(二)——数据更新和视图
- 使用CArchive类进行序列化
- ASP.NET Core gRPC 使用 Consul 服务注册发现
- 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)
- tornado 坑集合
- 一双耐克出厂价70元,代工老板赚到900亿身家
- lambda表达式学习(详细理解 ) 重点在最后
- Confluence 持续集成平台部署记录
- matlab·计算机视觉·工具箱
- 产品经理-思维导图梳理功能
- Java贪吃蛇小游戏
- RestClient操作文档
- comsol通直流电_COMSOL 在电力行业中的 10 种实际用途
- FPGA的基本设计流程
- 听我的!千万别学前端开发!
- Android AB系统ota更新
- 微信小程序获取用户收货地址与指纹验证接口(安卓和iphone)
- Restful 风格请求
热门文章
- Python字典使用教程:Python字典常用操作方法
- Python 字典的基本操作
- linux smartgit客户端,跨平台Git客户端SmartGit 18.1.5发布下载
- np.random.randint()
- c语言为什么是2的15次方,在C语言中为什么int型的取址范围为-2的15次方到2的15次方减1?...
- 深度洞见|罗兰贝格联合天猫发布《车企数字化营销白皮书》:围绕用户全生命周期,引领数字化创新之路...
- 基于word2vec的中文词向量训练
- 模式识别与机器学习(Python实现):决策树分男女
- 研究方法、技术路线、实验手段和关键技术的写法
- 企业级KVM虚拟化+oVirt私有云平台建设实践