1、ShaderLab
目前面向GPU的编程有三种高级图像语言:HLSL语言,GLSL语言,Cg语言。
HLSL语言:High Level Shading Language,由Microsoft公司提供,通过Direct3D图形软件库来编写的着色器语言。
GLSL语言:OpenGL Shading Language,由OpenGL安委会提供,在OpenGL中进行着色器编程的语言。
Cg语言:C for Graphics,由NVIDIA公司和Microsoft公司合作提供,有自己的一套关键字和函数库,独立于三维编程接口,在Direct3D和OpenGL上都可工作。
ShaderLab: Unity 自己又封装了一层CG/HLSL/GLSL的接口,但为了实现跨平台,Unity重点支持Cg着色器语言。所以我们使用的是ShaderLab
2、渲染流程
见【Unity Shader入门精要】概念基础
3、Shader的基本结构
看一下基本的Shader程序结构
Shader "Unlit_Tutorial_Shader"{
Properties{ //这个是告诉暴露给editor的属性,可以再编辑器中编辑
_Color("Total Color",Color) = (1,1,1,1) //告诉编辑器我有一个属性为Color的数据需要编辑
}
SubShader{ //每一个Shader都至少有一个SubShader
Pass{ //每个SubShader至少有一个Pass
CGPROGRAM
#pragma vertex vertexFunction //相当于声明顶点着色器的函数入口
#pragma fragment fragmentFunction //相当于申明片元着色器的函数入口
#include "UnityCG.cginc" //有一些常用函数和常量在这个文件中
struct a2v { //顶点数据结构
float4 vertex:POSITION; //顶点位置,应该是在模型坐标系下的
float2 uv:TEXCOORD0;//第一套纹理坐标
float3 normal:NORMAL;//顶点法线,应该也是在模型坐标系下的
};
struct v2f { //传入片元的数据结构
float4 position:SV_POSITION;//裁剪坐标系下的顶点坐标
float2 uv:TEXCOORD0;//第一套纹理UV坐标
};
float4 _Color; //在Properties声明的_Color,可以再编辑器中修改
v2f vertexFunction(a2v inValue) {//顶点着色器函数入口,要与声明的一致
v2f o;
return o;
}
//输出值将会存储到渲染目标(render target)中
fixed4 fragmentFunction(v2f inValue) :SV_TARGET{ //片元着色器函数入口,要与声明一致
return _Color;
}
ENDCG
}
}
}
网友评论