3D开发学习-着色语言 Shading Language基础(一)

慎峻
2023-12-01

一:简介:

OpenGL ES 着色语言是一种高级的图形编程语言.其源自应用广泛的C语言,同时具有RenderMan以及其他编程语言的一些优良特性.

与传统的语言不同的是,他提供了更加丰富的原生类型,比如向量,矩阵等.OpenGL ES着色语言的特性如下:

1.Open GL着色语言是一种高级的过程语言(不是面向对象)

2.对于顶点着色器,片元着色器使用的是同样的语言,不区分.

3.基于C/C++的语法及流程控制

4.完美支持向量与矩阵的各种操作

5.通过类型限定符管理输入和输出

6.拥有大量的内置函数,提供的功能丰富.

有人总结说过,OpenGL ES着色语言是一种易于实现,功能强大,便于使用,完美支持硬件灵活性,并且可以高度并行处理,性能优良的高级图形编程语言.因此,3D开发的话,掌握着色语言就变得尤为重要了.


二:着色语言基础:

虽然OpenGL ES的着色语言是基于C/C++的,但是还是有很多不一样的地方的.比如说,该语言不支持双精度(double),字节型(byte),短整型(short),长整形(long),并且取消了C的联合体(union),

枚举型(enum),无符号整形(unsigned)以及位运算等特点.

1.标量:标量在着色语言中被称为是 无向量 .只有大小,没有方向.运算尊选代数运算.主要类型有三个

布尔型:bool bool b;//申明一个布尔值

整形:int int i;//申明一个整形

浮点型:float float f;//申明一个浮点型

2.向量:可以理解为是用同样类型的标量组成,基本类型为bool,int,float三种.每个向量是有两个,三个,四个相同的标量组成的.

vec2 : 包含两个浮点数的向量;

vec3 : 包含三个浮点数的向量;

vec4 : 包含四个浮点数的向量;

ivec2 :包含两个整形数的向量;

bvec4 : 包含四个布尔型的向量;

特殊的一个点:当把向量看作颜色的时候,可以使用r g b a 四个分量,代表红 绿 蓝 透明度,如:

aColor.r = 0.6 ; //给向量aColor指定红色分量

aColor.a = 0.6 ; //给向量aColor指定透明度分量

当把向量看作坐标位置时可以使用x y z w四个分量,用法如颜色.

当把向量看作纹理坐标时,可以使用s t p q四个分量,用法如颜色.

此处,除了使用 . 作为加分量名外,还可以使用数组的方式实现,如:

aColor[0] = 0.6; // 给向量aColor指定红色分量

需要注意的是,一次只能使用一组分量,比如使用r g b a 的时候,不能混合 x y z w.

3.矩阵:矩阵,平凡用于3D中的旋转,缩放,平移等,因此,矩阵支持就显得很必要了.

mat2 : 2 X 2 的浮点数矩阵;

mat3 : 3 X 3 的浮点数矩阵;

mat4 : 4 X 4 的浮点数矩阵;

在着色语言中,矩阵是按照顺序组织的,也就是说可以看作是几个列向量组成.比如,mat3就是由3个vec3组成的.

在取值的时候,比如matrix是一个mat3的矩阵,那么matrix[1]就渠道的是这个矩阵的第二列,为一个vec3向量.matrix[1][1]取到的是第二行第二列的数,是一个float型.

4.采样器:不同与C语言的基本数据类型,采样器专门用来进行纹理采样.一个采样器代表一副或一套纹理贴图.

sampler2D : 用于访问2维纹理;

sampler3D : 用于访问3维纹理;

samplerCube : 用于访问立方贴图纹理;

5.结构体:自定义结构体,如C语言,关键词使用struct,例如:

struct info {

vec3 color;

vec3 position;

vec2 textureCoor;

}

6.数组:

vec3 position[20] ; //申明一个包含20个vec3的数组


vec3 position[] ; //申明一个大小不固定的数组

postion[3] = vec3(3.0) ; //position的大小需要是4

7.空类型:空类型使用void,例如:

void main() {                              }

 类似资料: