前期文章:
看其他相关文章的时候,上来就是一段着色器代码,因此导致:
- 看的迷迷糊糊
- 很片面,即使花时间看懂当前代码的意思,让自己去扩展,也一脸懵逼
学好一门语言的基础知识,是写好程序的第一步。
本篇总结OpenGL ES使用的基本语言基础知识,这些语言基础知识用于编写着色器(顶点着色器,片段着色器)相关代码,包括如下:
- 变量及其变量类型
- 向量
- 常量
- 数组相关
- 运算符
- 控制流程,函数
- 输入输出
- 其他
OpenGL ES着色语言基础知识
我们在整个处理流程中会涉及到顶点着色器和片段着色器,顶点着色器确定顶点的最终位置,片段着色器确定每个片段的最终颜色,这两个着色器都需要编写相应的代码。
着色器版本规范
#version 300 es
- 顶点着色器和片段着色器的第一行声明
- 告知编译器按照声明的着色语言版本检查着色器语法
- 以上代码声明着色器使用OpenGL ES 3.00版本
- 没有声明版本号的着色器被认定使用OpenGL ES着色语言的1.00版本
变量和变量类型
三种:标量,向量和矩阵
类别 | 类型 | 描述 |
---|---|---|
标量 | float, int, uint, bool | 浮点、整数、无符号整数、布尔值 |
浮点向量 | float, vec2, vec3, vec4 | 有1、2、3、4分量的浮点向量类型 |
整数向量 | int, ivec2, ivec3, ivec5 | 整数向量 |
无符号整数向量 | uint, uvec2, uvec3, uvec4 | 无符号整数向量 |
布尔向量 | bool, bvec2, bvec3, bvec4 | 布尔向量 |
矩阵 | mat2, mat2x3, mat 2x4 … mat 4 | 矩阵 |
可用这些类型定义相应的变量
vec4 a = vec4(1.0)
vec4 b = {1.0, 1.0, 1.0, 1.0}
vec4 c = vec4(a)
mat3 d = mat3(1.0, 0.0, 0.0, //first column
0.0, 1.0, 0.0, //second column
0.0, 1.0, 1.0) // Third column
常量
const float zero = 0.0 //定义常量
结构体
struct Temp
{
vec4 color;
float a;
float b;
}temp;
//初始化
temp = Temp(vec4(0.0,1.0,0.0,0,0),0,1,2.0);
数组
float arr[4]
vec4 vecArr[2];
运算符与其他大同小异
函数
- 与C语言基本一致
- 多了几个语言限定符用于标记参数
限定符 | 描述 |
---|---|
in | 指定参数按值传送,函数不能修改 |
inout | 变量按引用传入函数,如果该值被修改,将在函数退出后变化 |
out | 该变量的值不被传入函数,但函数返回时将被修改 |
//函数声明
vec4 fun(inout float para1
out vec4 para2
mat4 para3);
- 内建函数
pow, sin, log 等OpenGL ES 自带的函数
统一变量uniform
- 变量类型限定符之一
- 传入着色器的只读值
- eg.
uniform mat4 viewProjMatrix;
- 统一变量通常保存在硬件中,这个区域被称作“常量存储”
输入输出变量 in out
in
- 顶点输入变量
- 指定顶点着色器中每个顶点的输入
- 通常存储位置、颜色、发现、纹理坐标等数据
- eg.
in vec3 a_color
out
- 顶点着色器的输出变量
- 输出需要传递给片段着色器的数据
- eg.
out vec3 v_color
layout
- 限定符
- 指定顶点属性的索引
- 可选,如没有指定,将自动为顶点输入变量分配位置
精度限定符
- What: 指定着色器变量的计算精度
- Why : 较低的精度上,运行着色器速度更快
- DES : 分为低lowp、中mediump、高精度highp
- HOW: 对变量: highp vec4 position;
- 默认精度,在着色器开头 如: precision highp float;
程序说明
1. //顶点着色器
2. #version 300 es //指定OpenGL版本号
3.
4. //声明一个4维变化矩阵
5. uniform mat4 u_matViewProjection;
6. //顶点属性位置,layout声明location, in表示顶点输入变量
7. layout(location = 0) in vec4 a_position;
8. //顶点属性颜色,layout声明location, in表示顶点输入变量
9. layout(location = 1) in vec3 a_color;
10. //out表示输出颜色给片段着色器
11. out vec3 v_color
12. void main(void)
13. {
14. //gl_Position表示最终位置
15. gl_Position = u_matViewProjection * a_position;
16. //顶点输入颜色赋值给v_color传递给片段着色器
17. v_color = a_color;
18. }
19. //片段着色器
20. #version 300 es
21. //默认精度选择
22. precision mediump float;
23. //接受顶点着色器传递过来的颜色属性
24. in vec3 v_color;
25. //输出最终颜色给OpenGL ES.
26. layout(location = 0) out vec4 o_fragColor;
27. void main(){
28. o_fragColor = vec4(v_color, 1.0);
29. }