在没有Unity这类编辑器的情况下,如果我们想要对某个模型设置渲染状态,可能需要类似下面的代码:
//初始化渲染设置
void Initialization ( ) {
//从硬盘上加载顶点着色器的代码
string vertexShaderCode = LoadShaderFromFile(vertexShader.shader);
//从硬盘上加载片元着色器的代码
string fragmentShaderCode = LoadShaderFromFile (FragmentShader.shader) ;
//把顶点着色器加载到GPU中
LoadVertexshaderFromstring ( vertexShaderCode) ;
//把片元着色器加载到GPU中
LoadFragmentShaderFromString(fragmentShaderCode ) ;
//设置名为"vertexPosition"的属性的输入,即模型顶点坐标
SetVertexShaderProperty ( "vertexPosition", vertices);
//设置名为"MainTex"的属性的输入,someTexture是某张已加载的纹理
SetVertexShaderProperty ( "MainTex", someTexture) ;
//设置名为"MVP"的属性的输入,MVP是之前由开发者计算好的变换矩阵
SetVertexshaderProperty ( "MVP",MVP);
//关闭混合
Disable (Blend) ;
//设置深度测试Enable (ZTest) ;
SetZTestFunction ( LessOrEqual) ;
//其他设置
...
}
//每—帧进行渲染
void OnRendering () {
//调用渲染命令
DrawCall();
//当涉及多种渲染设置时,我们可能还需要在这里改变各种渲染设置
...
}
VertexShader.shader:
//输入:顶点位置、纹理、MVP变换矩阵
in float3 vertexPosition;
in sampler2D MainTex;
in Matrix4x4 MVP;
//输出:顶点经过MvP变换后的位置
out float4 position;
void main(){
//使用MVP对模型顶点坐标进行变换
position =MVP * vertexPosition;
}
FragmentShader.shader:
//输入:VertexShader输出的position、经过光栅化程序插值后的该片元对应的position
in float 4 position;
//输出:该片元的颜色值
out float4 fragColor;
void main() {
//将片元颜色设为白色
fragcolor = float4 (1.0,1.0,1.0,1.0);
}
上述伪代码仅仅是简化后的版本,当渲染的模型数目、需要调整的着色器属性不断增多时,上述过程将变得更加复杂和冗长。而且,当涉及透明物体等多物体的渲染时,如果没有编辑器的帮助,我们要非常小心如渲染顺序等问题。
Unity 的出现改善了上面的状况。它提供了一个地方能够让开发者更加轻松地管理着色器代码以及渲染设置(如开启/关闭混合、深度测试、设置渲染顺序等),而不需要像上面的伪代码一样,管理多个文件和函数等。Unity提供的这个“方便的地方”,就是 Unity Shader。
3.1 unity shader概述
3.1.1 材质和unity shader
3.1.2 unity中的材质