shader运行
1 .并行处理,shader是一系列指令,但是这些指令会同时对屏幕上的每个像素同时下达。
2 .屏幕上的每个像素都代表一个最简单的任务,可以单独完成,并且任务之间不会互相影响,并行的处理器越多,可以处理的数据流就越大
![](https://img.haomeiwen.com/i4927035/b0d832349e987ec1.png)
3 .为了使许多管线并行运行,每一个线程必须与其他的相独立。这些线程对于其他的进行都是“盲视”的。
4 .所以所有的数据必须以相同的方向流动。线程之间不能互相检查其他线程的输出结果,修改输入的数据,或者把一个线程的输出结果传递给另一个线程。
5 .GPU会放所有并行的微处理,图中的管道。一直处于忙碌状态,只要一有空闲就会接受到新的任务。一个线程不可能知道他的前一刻在做什么。可能是画了操作系统上的一个按钮,然后渲染了了游戏中的一部分天空,或者显示了一些文字。
6 .每个线程不仅仅是盲视的,而且是无记忆的。
内建变量
1 .gl_FragColor
2 .gl_Position
内建函数
数据类型
1 .vec4:分别响应rgba四个数
2 .vec3
3 .vec2
4 .float
1 .float类型在shader中非常重要,低精度有更快的渲染速度,以牺牲质量为代价。
2 .precision mediump float 设定所有浮点值都是中等精度
3 .precision lowp float:使用低精度
4 .precision highp float:使用高精度
5 .int
6 .bool
6 .mat2, mat3 和 mat4 分别代表 2x2, 3x3 和 4x4 矩阵
其余
1 .GLSL语言不会进行变量的类型转换,所以我们在写的时候一定要保持变量的类型一致
2 .比如float类型数值里面要价格点 1.,而不是1
3 .
代码解析
1 .shader语言会有一个main函数,会在最后返回颜色值,比如里面的gl_FragColor
2 .最终的像素颜色取决于预设的全局变量gl_FragColor
#ifdef GL_ES
precision mediump float;
#endif
uniform float u_time;
void main() {
gl_FragColor = vec4(1.0,0.0,1.0,1.0);
}
3 .最后效果:把画布上的每一个像素都改成了粉色
定义变量
1 . vec4 color=vecc(vec3(1.0,0.0,1.0),1.0)
定义函数
1 .定义一个返回红色的函数
vec4 red(){
return vec4(1.0,1.0,0.1,1.0)
}
网友评论