0011--GLSL语言学习(一)
2020-07-29 本文已影响0人
清风烈酒2157
前言
OpenGL ES
的渲染管线包含有一个可编程的顶点阶段的一个可编程的片段阶段。其余的阶段则有固定的功能,应用程序对其行为的控制非常有限。每个可编程阶段中编译单元的集合组成了一个着色器。在OpenGL ES
中,每个着色器只支持一个编译单元。着色程序则是一整套编译好并链接在一起的着色器的集合。着色器 shader
的编写需要使用着色语言 GL Shader Language(GLSL)
,GLSL
的语法与 C
语言很类似.
- 着色器架构
规则
习惯上,我们一般把顶点着色器命名为 xx.vsh
,片段着色器命名为 xx.fsh
。
文件中尽量少使用汉字注释防止编译错误
.
GLSL
写出的着色器:
- 变量
position
- 变量类型
vec4
- 限定符
attribute
-
main
函数 - 基本赋值语句
colorVarying = color
- 内置变量
gl_Position
- …
一个简单顶点着色器和片元着色器代码
.vsh
attribute vec4 position;
attribute vec4 color;
varying vec4 colorVarying;
vec4 myVec4 = vec4(1.0);
void main(void){
colorVarying = color;
gl_Position = position;
}
.fsh
varying lowp vec4 colorVarying;
void main (void){
gl_FragColor = colorVarying;
}
gl_Position
:顶点着色器的输出属性-变换后的顶点的位置,用于后面的固定的裁剪等操作。所有的顶点着色器
都必须写这个值。在顶点着色器
中必须要设置
gl_FragColor
:片元着色器中的输出属性-每个像素点的颜色值。在片元着色器中必须要设置
变量
- 变量及变量类型
变量类别 | 变量类型 | 描述 |
空 | void |
用于无返回值的函数或空的参数列表 |
标量 | float, int, bool |
浮点型,整型,布尔型的标量数据类型 |
浮点型向量 | float, vec2, vec3, vec4 |
包含1,2,3,4个元素的浮点型向量 |
整数型向量 | int, ivec2, ivec3, ivec4 |
包含1,2,3,4个元素的整型向量 |
布尔型向量 | bool, bvec2, bvec3, bvec4 |
包含1,2,3,4个元素的布尔型向量 |
矩阵 | mat2, mat3, mat4 |
尺寸为2x2,3x3,4x4的浮点型矩阵 |
纹理句柄 | sampler2D, samplerCube |
表示2D,立方体纹理的句柄 |
GLSL中没有指针类型.
- 变量构造器和类型转换
对于变量运算,GLSL
中有非常严格的规则,即只有类型一致时,变量才能完成赋值或其它对应的操作。可以通过对应的构造器来实现类型转换
标量
标量对应 C
语言的基础数据类型,它的构造和C
语言一致,如下:
float myfloat = 1.0;
float mybool = true;
float myfloat = float(mybool);
float mybool = bool(myfloat);
向量
当构造向量时
,向量构造器中的各参数
将会被转换成
相同的类型(浮点型
、整型
或布尔型
)。往向量构造器中传递参数有两种形式:
- 如果向量构造器中只提供了
一个标量参数
,则向量中所有值都会设定为该标量值。 - 如果提供了
多个标量值
或提供了向量参数
,则会从左至右使用提供的参数来给向量赋值
,如果使用多个标量来赋值,则需要确保标量的个数要多于向量构造器中的个数。
向量构造器用法如下:
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= {1.0, 0.0, 0.5}
vec2 myVec2 = vec2(myVec3);//myVec2 = {myVec3.x, myVec3.y}
myVec4 = vec4(myVec2,temp,0.0); //myVec4 = {myVec2.x, myVec2.y , temp, 0.0 }
矩阵
矩阵数据类型:
image.png注:一般使用3x3、4x4的方阵 – mat3、mat4
修饰符
修饰符:
image.png