OpenGL入门详解(4.OpenGL ES着色器语言)

前期文章:

  • OpenGL入门详解(1.OpenGL是什么?)
  • OpenGL入门之路(2.Android GLSurfaceView详解)
  • OpenGL入门详解(3.OpenGL基本流程)

看其他相关文章的时候,上来就是一段着色器代码,因此导致:

  • 看的迷迷糊糊
  • 很片面,即使花时间看懂当前代码的意思,让自己去扩展,也一脸懵逼

学好一门语言的基础知识,是写好程序的第一步。

本篇总结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.	}

你可能感兴趣的:(opengl)