OpenGL学习之着色器语言

本文介绍了OpenGL ES着色器语言的基本概念,包括数据类型、向量、矩阵、常量、结构、限定符和函数。重点讲解了向量和矩阵的操作,以及attribute、uniform和varying限定符的用法。此外,还提到了内建函数和内建变量在着色器中的作用,以及精度限定符的概念。最后,通过实例展示了如何使用着色器语言绘制三角形。
摘要由CSDN通过智能技术生成

着色器语言

Open GL ES 着色器语言是一种高级的图形编辑语言,主要特性:
1. OpenGL ES着色器语言是一种高级的过程语言
2. 对顶点着色器,片元着色器使用的是同样的语言,不做区分
3. 基于C/C++的语法及流程控制
4. 完美支持向量与矩阵的各种操作
5. 拥有大量的内置函数来提供丰富的功能

数据类型

OpenGL ES虽然是基于C/C++语法的,但是还是有很大的不同。该语言不支持double,byte,short,long,也取消了C中的union,enum,unsigned以及位运算。

基本数据类型

GLSL有三种基本数据类型:float,int,bool,还有由这三种数据类型组成的数组和结构体

bool b;
int a = 15;
int b = 036;//0开头的字面常量为八进制
int c = 0x3D;//0x开头的字面常量为十六进制
float myFloat = 1.0;
float floatArray[4];
float a[4] = float[](1.0, 2.0, 3.0, 4.0);
float b[4] = float[4](1.0. 2.0, 3.0, 4.0);

int 的取值范围和C中的不同,在GLSL中,int的取值范围是16位精度。

向量

GLSL中,向量可以看做是用同样类型的标量组成,其基本类型也分为bool,int和float三种。每个向量可以由2个,3个或者4个相同的标量组成:

向量类型 说明 向量类型 说明
vec2 包含了2个浮点数的向量 ivec4 包含了4个整数的向量
vec3 包含了3个浮点数的向量 bvec2 包含2个布尔数的向量
vec4 包含了4个浮点数的向量 bvec3 包含了3个布尔数的向量
ivec2 包含了2个整数的向量 bvec4 包含了4个布尔数的向量
ivec3 包含了3个整数的向量
vec2 v2;
ivec3 v3;
bvec4 v4;

向量在着色器代码的开发中十分重要,可以很方便的存储以及操作颜色,位置,纹理坐标等。也可以单独访问向量中的某个分量,基本语法为< 向量名>.<分量名>

  • 将向量看做颜色时,可以使用r,g,b,a 4个分量名,分别代码红,绿,蓝,透明度

    aColor.r = 0.6;
    aColor.g = 0,8;

  • 将一个向量看做位置时。可以使用x,y,z,w等4个分量名,其分别代表x轴,y轴,z轴,向量的模

    aPosition.x = 67.2;
    aPosition.z = 34.5;

  • 将一个向量看做纹理坐标时,可以使用s,t,p,q 4个分量名,其分别代表纹理坐标中的1维,2维,3维

矩阵
矩阵类型 说明
mat2 2x2的浮点数矩阵
mat3 3x3的浮点数矩阵
mat4 4x4的浮点数矩阵

OpenGL ES着色器语言中,矩阵是按列顺序组织的,也就是一个矩阵可以看做由几个列向量组成。例如,mat3就可以看做由3个vec3组成。

对于矩阵的访问,可以将矩阵作为列向量的数组来访问。如; matrix 为一个mat4,可以使用matrix[2]取到该矩阵的第三列,其为一个vec4;也可以使用matrix[2][2]取得第三列的向量的第三个分量,其为一个float。

GLSL在类型转换方面有非常严格的规则,变量只能赋值给相同类型的其他变量或者与相同类型的变量进行运算。

float myFloat1 = 1.0;
float myFloat2 = 1; // error: invalid type conversion

只能使用构造函数来完成类型换行

float f = 1.0;
bool b = bool(f);
float f1 = float(b);

同样,向量也可以使用构造器,向量构造器的参数传递有两种基本的用法

  • 如果只为向量构造器提供一个标量参数,则该值涌来设置向量的所有值
  • 如果提供了多个标量或者向量参数,则向量的值从左到右使用这些参数设置

    vec4 myVec4 = vec4(1.0); // {1.0, 1.0, 1.0, .10}
    vec3 myVec3 = vec3(1.0, 1.0, 1.0); // {1.0, 1.0, 1.0}
    vec3 temp = vec3(myVec3);

    vec2 myVec2 = vec2(myVec3); // {myVec3.x, myVec3.y}
    myVec4 = vec4(myVec2, myVec3); // {myVec2.x, myVec2.y, myVec3.x, myVec3.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值