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

前期文章:

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

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

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

本篇总结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.	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值