// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Shy/1_SimpleShader"
{
Properties
{
//声明一个Color属性 后面没有分号
_Color("Color",Color) = (1.0,1.0,1.0,1.0)
}
SubShader
{
Pass
{
CGPROGRAM
// 简单的Shader
////告诉Unity,哪个函数包含了顶点着色器代码,哪个函数包含了片元着色器代码。 vert、frag是自定义函数名
//#pragma vertex vert
//#pragma fragment frag
////逐顶点执行,语义:告诉系统用户需要哪些输入值,以及用户的输出是什么。
////POSITION:告诉Unity,把模型的顶点坐标填充到输入参数v中
////SV_POSITON:告诉Unity,顶点着色器输入的是裁剪空间中的顶点坐标
//float4 vert(float4 v : POSITION):SV_POSITION
//{
// //把顶点坐标从模型空间转换到裁剪空间
// //replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// return UnityObjectToClipPos(v);
//}
//
////SV_Target:告诉渲染器,把用户的输出颜色存储到一个渲染目标(render target)中,这里将输出到默认的帧缓存中。
//fixed4 frag():SV_Target
//{
// return fixed4(0.5,0.5,1.0,1.0);
//}
// 增加输入结构体
//#pragma vertex vert
//#pragma fragment frag
////使用一个结构体定义顶点着色器的输入
////Unity支持的语义:POSITION、TANGENT、NORMAL、TEXCOORD0/1/2/3、COLOR等
////POSITON、NORMAL、TANGENT:这些语义的数据由使用该材质的MeshRender提供
////在每帧调用DrawCall的时候,MeshRender组件会把它负责渲染的模型数据发送给UnityShader。
////结构体变量定义:类型 变量名称:语义(不可省略)
////a2v:a-application 2-too v-vertex shader 把数据从应用阶段传递到顶点着色器中
//struct a2v
//{
// //POSITION语义:告诉Unity,用模型空间的顶点坐标填充vertex变量
// float4 vertex:POSITION;
// //NORMAL语义:告诉Unity,用模型空间的法线方向填充normal变量
// float3 normal:NORMAL;
// //TEXCOORD0语义:告诉Unity,用模型的第一套纹理坐标填充texcoord变量
// float4 texcoord:TEXCOORD0;
//};
//
//float4 vert(a2v v):SV_POSITION
//{
// return UnityObjectToClipPos(v.vertex);
//}
//fixed4 frag():SV_Target
//{
// return fixed4(0.5,0.5,1.0,1.0);
//}
////增加输出结构体 完成vertex/fragment之间的通信
//#pragma vertex vert
//#pragma fragment frag
//struct a2v
//{
// float4 vertex:POSITION;
// float3 normal:NORMAL;
// float4 texcoord:TEXCOORD0;
//};
////使用一个结构体来定义顶点着色器的输出
//struct v2f
//{
// //SV_POSITION:告诉Unity,pos包含了顶点在裁剪空间中的位置信息
// float4 pos:SV_POSITION;
// //COLOR0:用于存储颜色信息
// fixed3 color : COLOR0;
//};
//
//v2f vert(a2v v)
//{
// //声明输出结构
// v2f o;
// o.pos = UnityObjectToClipPos(v.vertex);
// //v.normal包含了顶点的法线方向,其分量范围在【-1.0,1.0】
// //下面的代码把分量范围映射到了【0.0,1.0】
// //存储到o.color中传递给片元着色器
// o.color = v.normal*0.5 + fixed3(0.5, 0.5, 0.5);
// return o;
//}
//fixed4 frag(v2f i):SV_Target
//{
// //将插值后的i.color显示到屏幕上
// return fixed4(i.color,1.0);
//}
//
////注意:顶点着色器是逐顶点调用的,而片元着色器是逐片元调用的。片元着色器中的输入实际上是把顶点着色器的输出进行差值后得到的结果。
//增加属性
#pragma vertex vert
#pragma fragment frag
//在CG代码中,需要定义一个与属性名称和类型都匹配的变量
fixed4 _Color;
struct a2v
{
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
};
struct v2f
{
float4 pos:SV_POSITION;
fixed3 color : COLOR0;
};
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.normal*0.5 + fixed3(0.5, 0.5, 0.5);
return o;
}
fixed4 frag(v2f i):SV_Target
{
fixed3 c = i.color;
c *= _Color.rgb;
return fixed4(c,1.0);
}
ENDCG
}
}
}
Shader "Shy/1_SimpleShader"
{
Properties
{
//声明一个Color属性 后面没有分号
_Color("Color",Color) = (1.0,1.0,1.0,1.0)
}
SubShader
{
Pass
{
CGPROGRAM
// 简单的Shader
////告诉Unity,哪个函数包含了顶点着色器代码,哪个函数包含了片元着色器代码。 vert、frag是自定义函数名
//#pragma vertex vert
//#pragma fragment frag
////逐顶点执行,语义:告诉系统用户需要哪些输入值,以及用户的输出是什么。
////POSITION:告诉Unity,把模型的顶点坐标填充到输入参数v中
////SV_POSITON:告诉Unity,顶点着色器输入的是裁剪空间中的顶点坐标
//float4 vert(float4 v : POSITION):SV_POSITION
//{
// //把顶点坐标从模型空间转换到裁剪空间
// //replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// return UnityObjectToClipPos(v);
//}
//
////SV_Target:告诉渲染器,把用户的输出颜色存储到一个渲染目标(render target)中,这里将输出到默认的帧缓存中。
//fixed4 frag():SV_Target
//{
// return fixed4(0.5,0.5,1.0,1.0);
//}
// 增加输入结构体
//#pragma vertex vert
//#pragma fragment frag
////使用一个结构体定义顶点着色器的输入
////Unity支持的语义:POSITION、TANGENT、NORMAL、TEXCOORD0/1/2/3、COLOR等
////POSITON、NORMAL、TANGENT:这些语义的数据由使用该材质的MeshRender提供
////在每帧调用DrawCall的时候,MeshRender组件会把它负责渲染的模型数据发送给UnityShader。
////结构体变量定义:类型 变量名称:语义(不可省略)
////a2v:a-application 2-too v-vertex shader 把数据从应用阶段传递到顶点着色器中
//struct a2v
//{
// //POSITION语义:告诉Unity,用模型空间的顶点坐标填充vertex变量
// float4 vertex:POSITION;
// //NORMAL语义:告诉Unity,用模型空间的法线方向填充normal变量
// float3 normal:NORMAL;
// //TEXCOORD0语义:告诉Unity,用模型的第一套纹理坐标填充texcoord变量
// float4 texcoord:TEXCOORD0;
//};
//
//float4 vert(a2v v):SV_POSITION
//{
// return UnityObjectToClipPos(v.vertex);
//}
//fixed4 frag():SV_Target
//{
// return fixed4(0.5,0.5,1.0,1.0);
//}
////增加输出结构体 完成vertex/fragment之间的通信
//#pragma vertex vert
//#pragma fragment frag
//struct a2v
//{
// float4 vertex:POSITION;
// float3 normal:NORMAL;
// float4 texcoord:TEXCOORD0;
//};
////使用一个结构体来定义顶点着色器的输出
//struct v2f
//{
// //SV_POSITION:告诉Unity,pos包含了顶点在裁剪空间中的位置信息
// float4 pos:SV_POSITION;
// //COLOR0:用于存储颜色信息
// fixed3 color : COLOR0;
//};
//
//v2f vert(a2v v)
//{
// //声明输出结构
// v2f o;
// o.pos = UnityObjectToClipPos(v.vertex);
// //v.normal包含了顶点的法线方向,其分量范围在【-1.0,1.0】
// //下面的代码把分量范围映射到了【0.0,1.0】
// //存储到o.color中传递给片元着色器
// o.color = v.normal*0.5 + fixed3(0.5, 0.5, 0.5);
// return o;
//}
//fixed4 frag(v2f i):SV_Target
//{
// //将插值后的i.color显示到屏幕上
// return fixed4(i.color,1.0);
//}
//
////注意:顶点着色器是逐顶点调用的,而片元着色器是逐片元调用的。片元着色器中的输入实际上是把顶点着色器的输出进行差值后得到的结果。
//增加属性
#pragma vertex vert
#pragma fragment frag
//在CG代码中,需要定义一个与属性名称和类型都匹配的变量
fixed4 _Color;
struct a2v
{
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
};
struct v2f
{
float4 pos:SV_POSITION;
fixed3 color : COLOR0;
};
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.normal*0.5 + fixed3(0.5, 0.5, 0.5);
return o;
}
fixed4 frag(v2f i):SV_Target
{
fixed3 c = i.color;
c *= _Color.rgb;
return fixed4(c,1.0);
}
ENDCG
}
}
}