OpenGL ES着色器使用详解(二)

  

本文介绍了OpenGL ES着色器使用的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  

<强> 1。着色器语言

  

着色器语言是一种高级图形编程语言,和C/c++语言很类似,但存在很大差别,比如,不支持双字节

  

,短,不支持unin,枚举,无符号以及位运算等,但其加入了很多原生的数据类型,如向量,矩阵等。

  

数据类型可分为标量,向量,矩阵,采样器,结构体,数组等

  

 OpenGL ES着色器使用详解(二)

  

<强>向量

  

向量传递参数,如果只提供一个标量,这个值用于设置所有向量的值,如果输入是多个标量或者是矢量,从左到右设置矢量变量的参数,如果多个矢量作为参数,那么至少要有和变量一样多的分量

        vec4 myVec4=vec4 (1.0);//myVec4={1.0, 1.0, 1.0, 1.0}   vec3 myVec3=vec3 (1.0, 0.0, 0.5);//myVec3={1.0, 0.0, 0.5}   vec3 temp=vec3 (myVec3);//temp=myVec3   vec2 myVec2=vec2 (myVec3);//myVec2={myVec3。x, myVec3.y}   myVec4=vec4 (myVec2、临时);//myVec4={myVec2。x, myVec2。y, temp.x, temp.y}      

<强>矩阵

  

矩阵操作在OpenGL ES中的使用非常广泛,涉及到图形的平移缩放旋转等操作都是由矩阵来实现的。

  

向矩阵传递参数:

  
      <李>提供的是一个标量,那么标量复制给与矩阵的主对角线李   <李>一个矩阵能被多个向量赋值,如,mat2可以用两个vec2赋值   <李>一个的矩阵被多个标量赋值,按列赋值
      李   
  

<强>向量和矩阵的分量

  

向量一般用来存储位置,颜色纹理坐标等包含不止一个的量,访问向量中某个分量的方法为:& lt;向量名。分量名祝辞

  
      <李>将向量看做颜色对待,四个分量为r, g, b, a,分别代表红,绿,蓝,透明度   <李>将向量看做位置对待,四个分量为x, y, z, w,分别代表x轴、y轴,z轴,w   <李>将向量看做纹理坐标对待,四个分量为年代,t, p, q,分别代表纹理坐标的不同分量
      李   
  

这三种不同的命名方案不能混合使用,除此之外还可以将向量当做数组看待,用下表来访问。

        vec3 myVec3=vec3 (0.0, 1.0, 2.0);//myVec3={0.0, 1.0, 2.0}   x=myVec3.x浮动;   vec3温度;   temp=myVec3.xyz;//temp={0.0, 1.0, 2.0}   temp=myVec3.xxx;//temp={0.0, 0.0, 0.0}   temp=myVec3.zyx;//temp={2.0, 1.0, 0.0}   vec4 temp2=myVec3.xxyz;//temp2={0.0, 0.0, 1.0, 2.0}      

对矩阵的访问当成一个二维数组即可,矩阵可以认为是由多个向量组成的

        mat4 myMat4=mat4 (1.0);//初始化斜到1.0(身份)   vec4 col0=myMat4 [0];//得到col0向量的矩阵   浮动m1_1=myMat4 [1] [1];//获取元素在矩阵[1][1]   浮动m2_2=myMat4[2]还是z;//获取元素在矩阵[2][2]      

<>强采样器

  

采样器专门用于进行纹理采样的相关操作,一般情况下一个采样器变量代表了衣服纹理切贴图。

  

sampler2D/sampler3D samplerCube

  

采样器变量不是在着色器中初始化的,一般是由主程序传递进来的。

  

<强>数组

  

声明数组时指定数组大小,反之,访问数组时的下表必须是编译时常量,这样的话,编译器会自动创建适当大小的数组

  

<强>类型转换

  

着色器语言没有自动提升的功能,也不能强制转换,只能用构造器完成类型转换,每中内建变量类型都有一组相关的构造器。

        浮动f=1;//错误   int i=0.0;//错误   浮动f=1.0//好吧   bool b=bool (f)//好吧,非0当做正确的   浮动f=浮动(b)//好吧,bool转为浮点数,真正转为1.0,假转为0.0   int i=0;//好吧   bool b=bool (i)//好吧,int转为bool      

<强>变量限定符

  

const:常量,编译时常量,其值不可变,可以提高运行效率

  

属性:属性变量,仅仅用在顶点着色器,用该限定符修饰的变量用来接受从宿主程序传进渲染管线的变量。一般用于每个顶点都不相同的量,比如顶点位置,颜色,法线等

  

制服:统一变量,一般用于对同一组顶点组成的一个物体所有顶点都相同的量,比如光源位置,转换矩阵,颜色,光照等

  

不同:变量被用来存储顶点着色器的输出和片元着色器的输入,每个顶点着色器把输出数据转变成一个或更多片元着色器的输入,在光栅化阶段就会插值生成一系列变量

OpenGL ES着色器使用详解(二)