当前位置:   article > 正文

GLSL语言OpenGLES(三)_glsl mod()

glsl mod()

前言

前面讲解了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有着非常严格的规则,进行赋值,加减乘除运算必须类型一直,否则会出现语法错误。如果不一致则必须进行强制类型转换

 

  1. float myFloat = 1.0;
  2. bool myBool = true;
  3. float result = myFloat + myBool(myBool);

2、Structures 结构体
GLSL支持结构体,把一些系统定义的类型聚到一起,组成自定义的类型,也可以包括事先声明的结构体,但是不能定义嵌套结构体。例如:

 

  1. struct myStruct
  2. {
  3. float f1;
  4. bool f2;
  5. vec3 v3;
  6. }
  7. // 声明结构体变量
  8. myStruct lightVar2;
  9. struct myStruct2
  10. {
  11. float f1;
  12. myStruct st1; //合法
  13. struct str2{ // 不合法
  14. bool b1;
  15. float f2;
  16. }
  17. }

3、Arrays 数组
GLSL中的数组和C的数组很类似,支持最基本类型,也支持结构体的数组。例如:

 

  1. float frequencies[3];
  2. uniform vec4 lightPosition[4];
  3. const int numLights = 2;
  4. light lights[numLights];
  5. //备注 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向量的长度

 

  1. vec2 v = vec2(3.0);
  2. v.x //正确
  3. v.z // 错误
  4. // 向量的元素可以放在一起
  5. vec4 v = vec4(1,2,3,4);
  6. v.zy // 等于 vec2(3,2)
  7. vec3 v3 = v.xyz // 等于vec3(1,2,3)
  8. v.rgba // 此种方式不正确,下表同时只能使用一个集合中的名称
  9. v.yx = vec2(3,0) // 将y和x的位置互换并给他们的赋值为新的值,将变成 vec4(3,0,3,4);

6、矩阵元素的操作方式

 

  1. // 用[]访问元素
  2. mat4 m;
  3. m[1] = vec4(2.0); // sets the 4th element of the third column to 2.0
  4. m[0][0] = 1.0; // sets the upper left element to 1.0
  5. 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 ∗ a

  • dot()函数:
    功能:计算两个元素的乘积
    定义: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可以是普通的数也可以是矩阵
    公式:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/574025
推荐阅读
相关标签
  

闽ICP备14008679号