SimpleShader

这篇博客详细介绍了Unity中的Shader编程,特别是SimpleShader。通过示例代码展示了如何定义顶点着色器和片元着色器,以及如何在Shader中使用属性。讲解了从模型空间到裁剪空间的转换,并阐述了顶点着色器和片元着色器的工作原理,以及如何在着色器中处理颜色和法线信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 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
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值