着色器语言:变量类型
介绍:着色器语言和C,C++编程语言一样
-
为什么存在和简单介绍:
- 先了解到有两种渲染管线
-
固定渲染管线
- 是可配置的管线
- 要不同效果时需要打开不同开关组合成不同效果
- 弊端
- 需要搭配各种开关
-
可编程渲染管线
将很多可配置开关改为编程实现
通过编程实现各种效果
-
可编程那么久需要编程语言
-
GPU提供一整套汇编指令集进行编程
- MSDN中可以看到部分指令集
- 比如矩阵乘法、赋值MOV等等
- MSDN中可以看到部分指令集
-
问题是汇编难度大
-
于是出现两种语法类似的高级着色器语言:都是类C的,编程最终编译成对应汇编指令集
- DX:HLSL
- MSDN上
- OpenGL:GLSL
- WiKi
- DX:HLSL
-
-
-
- 先了解到有两种渲染管线
语法介绍
-
标量
bool # true | false
int #32位有符号整数
-
half #16位浮点数(float一半)
- unity中有改名定义为fixed
float #32位浮点数
double #64位浮点数
unity中
fixed a = 1;
-
可以看到有
#include "UnityCG.cginc"
-
shader根据不同平台分配别名
C:\Program Files\Unity\Editor\Data\CGIncludes\HLSLSupport.cginc
-
依次在安装目录找到 引入的文件并找到根文件可以看到 定义别名(为的是跨平台管理)
可以看到在有些平台把half等改名成了fixed
-
向量类型
float2 #2D向量
float3#3D向量
-
float4 #4D向量
float4 a = float4(1,2,3,4)
-
复合分置:获得分量
float4 u = {1.0f, 2.0f, 3.0f, 4.0f}
u.xyzw
u.wyyz
u.zzxy
-
再如获取rgb值
fixed4 c = ....; fixed4 o = ...; o.Albedo = c.rgb;
-
也可以直接作为返回
fixed frag(v2f i):..{ fixed4 col = tex2D(_MainTex, i.uv); return col.gbar; } //等价于 fixed ret = fixed4(col.g, col.b, col.a, col.r); return ret;
-
矩阵类型
- float2x2 #2x2矩阵 有些平台有可能称为mat2
- float3x3 #3x3矩阵 mat3
- float4x4 #4x4矩阵 mat4
-
数组
- float m[4]
- half a[2]
- float3 v[12]
-
结构体
结构体的定义方法跟C/C++完全一样。但是结构体不能包含函数。
//代表输入数据 struct Input { float3 pos; float3 normal; float2 uvO; float2 uvl; }
-
typedef关键字(#define)
typedef与C/C++功能一样。即给某个类型指定一个别名
-
typedef
typedef float2 point; //float指定为point float2 pos = point pos
- 使用C程序做个范例
#include <stdio.h> int main(int argc, const char * argv[]) { typedef int wwnje; wwnje i= 233; int j = 322; printf("%d, %d", i, j); return 0; }
-
(#define)宏定义,使用定义的字符串替换名称
-
使用C程序做个范例
#include <stdio.h> #define wwnje int int main(int argc, const char * argv[]) { wwnje i= 233; int j = 322; printf("%d, %d", i, j); return 0; }
-
-
-
变置修饰符
- static #静态类型,程序无法访向这个变量
- uniform #常置,程序指定一个值,在着色器中不会在发生变化,也无法改变
- const #常量
-
类型转换
-
在高级着色器里转换机制非常炅活
float3 n = fioat3(1, 0,0) ; float3 v = 2.0f * n - 1.0f;
-
也可以同时使用组合分量
float3 n = fioat3(1, 0,0) ; float3 v = 2.0f * n.xyz - 1.0f;
-