我的第一个shader
Shader "Custom/BaseShader" // shader标头,"Custom/BaseShader" 是unity inspector界面中材质球查找改shader的路径
{
Properties // 属性组件 定义shader可供用户操作的公开属性,会在unity inspector界面中创建出属性实例
{
// 定义了一个名为_MainTex的变量,变量的数据类型是2D,unity inspector界面中显示名为 Texture 默认白色
_MainTex ("Texture", 2D) = "white" {}
}
// shader子集
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
// 通道
Pass
{
// CG程序开头
CGPROGRAM
// 定义顶点着色器程序
#pragma vertex vert
// 定义片元着色器程序
#pragma fragment frag
// 载入 UnityCG文件,包含了Unity中定义的一些通用的方法,如坐标转换等
#include "UnityCG.cginc"
// 顶点着色器输入包(数据来源于网格)
struct appdata
{
float4 vertex : POSITION; // 顶点位置信息
float2 uv : TEXCOORD0; // 顶点UV信息
};
// 顶点着色器输出包(处理后的数据,提供给多边形着色器或者片元着色器)
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
// 声明shader内部使用的变量,如果是支持用户操作的,变量名需要和Properties中定义的对应
sampler2D _MainTex;
// 记录着材质球中 Tiling和offset的数据(具体哪个变量对应哪个图片,我还没搞明白,需要后续接着确认,可能是依靠名字?)
float4 _MainTex_ST;
// 顶点着色器程序
v2f vert (appdata v)
{
v2f o;
// 顶点坐标转换 从自身坐标系转换到投影坐标系
o.vertex = UnityObjectToClipPos(v.vertex);
// 完成对于uv拼接,偏移的操作
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// 根据uv对纹理进行采样获取颜色数据
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}
好像在每一个地方都做了相应的注解,然后词穷了,就这样吧.顶点输入输出包中可以包含的信息可以在在(msdn)HLSL中查看
网友评论