目录
上节课我们学到,空的shader是玫红色的,英文里叫pink(我实在不想承认它是粉红色)
这节课我们要学习shader简单的语法格式。
shader里面可以放很多其他的东西,每个东西我们都要给分一个块,同时,我们必须有的一个块是具体影响shader行为的块,它的名字叫SubShader。
代码如下:
Shader "Custom/001"
{
SubShader{ }
}
有时候,同一个物体,我希望它一会变成水的状态,一会变成石头的状态。那么这部分内容我们必须写在同一个SubShader块中,但又要把他们区分开。所以出现了一个语法叫Pass。
一个SubShader里,可以写很多Pass,一个水Pass,一个石头Pass等等。
代码如下:
Shader "Custom/001"
{
SubShader
{
//假如这里写水的渲染
pass{ }
//假如这里写石头的渲染
pass{ }
}
}
上文说过,我们用的是unity给我们升级过的语言,shader原本的语言之一是CG语言(CGPROGRAM),我们要告诉一下unity后面会出现CG语言,让它能认识。
代码如下:
Shader "Custom/001"
{
SubShader
{
pass
{
CGPROGRAM //开始CG语言了
ENDCG //CG语言结束了
}
}
}
之前提过,我们并没有完全接手所有的shader过程,只是参与一部分,那么如何正确的“交接”就是一个很重要的事情。语义的功能,就是负责“交接”。
因此,shader规定了一些词汇,可让你获得一些信息,也可以去传递一些信息,这些词汇就叫做语义,他的用法就是:语义词汇。
例:
需求:我希望拿到现在shader所在模型的每个顶点的位置。
语义:Shader说,只要你用了:POSITION就能拿到这个数据。
声明:因为POSITION的数据是Vector4,所以我们也需要一个Vector4来接应这个数据。
CG语言:在CG语言里,Vector2的表达是float2,Vector3的表达是float3,Vector4的表达是float4,所以我们声明的是float4
备注:这里只是写法不一样,本质就是四个数,就像西红柿和番茄一样,地域不同叫法不一样。
代码如下:
//声明变量float4 //变量名称v //POSITION就是语义,你只要:POSITION就能获取到模型的顶点
float4 v:POSITION
写代码大多需要引入,例如:C#里的using UnityEngine;
在shader里,引入是#pragma
不同点:shader引入后需要给引入的内容起个名字,下面案例起名叫vert
代码如下:
#pragma vertex vert
和C#一样,引用之后,就可以用引入内容里有的方法,在这里当你引入了顶点着色器并起了名,你就可以用顶点着色器的方法了。
顶点着色器的方法代码如下:
#pragma vertex vert
float4 vert()
{
return //一个float4
}
本节课了解了Shader的基本语法。
下节课我们会利用学会的语法,讲一个简单的干预颜色案例。?