首先创建一个shader 点击Create > Shader > Unlit Shader 创建顶点片头shader
B站的学习视频网址
Shader "Unlit/NewUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
这是默认会创建的
其中主要有几个必须要写的
一个是shader的名字和路径
Shader "Unlit/NewUnlitShader"
第二个是可以在显示面板下修改并影响shader
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
第三个是Subshader 一个shader可以同时带有多个shader,这个先不管我们先只写一个SubShader就好了
SubShader里面要有Pass{} Pass里面写CGPROGRAM … ENDCG 所以shader代码都是写在这个CGPROGRAM … ENDCG中间
这个时候该说一下渲染流水线了 你只能通过修改顶点和片元着色器来干预物体的外观
每个工位想要修改什么都需要声明数据类型来接收数据
如:float4 vert (float4 vertex : POSITION)
这个意思是用float4 vertex接受上个工位传来的位置信息 用来修改后传给下个工位
其中 vert函数是干预顶点的shader 可以把一个平面做成曲面
frag函数 是干预着色的 就是干预颜色
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 vert (float4 vertex : POSITION):POSITION
{
return UnityObjectToClipPos(vertex);
}
fixed4 frag () : SV_Target
{
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG
}
}
第四个是 FallBack 这个是当所有shader都不能运行时执行的shader 也就是备胎
下面附上通过在控制面板修改颜色就能直接修改物体颜色的代码
Shader "Unlit/ChangeColor"
{
//可以不存在Properties 但是必须存在SubShader 和 Pass 块
Properties
{
_Color("Color",Color) =(1,1,1,1)
}
SubShader
{
Pass
{
CGPROGRAM
//vertex顶点函数 这里只是声明了顶点函数的函数名 将顶点坐标从模型空间转换到剪裁空间
#pragma vertex vert
//fragment片元函数 返回模型对应屏幕上的每一个像素的颜色值
#pragma fragment frag
// make fog work
struct appdata
{
float2 uv : TEXCOORD0;
};
fixed4 _Color;
//POSITIN是一个语义 接受上个工位传来的位置信息
//SV_POSITION也是一个语义 用来说明返回值 将返回值剪裁空间的坐标给系统
//vert的返回值 float4是内置向量 (x, y, z, w); float4 a; 访问单独成员a.x, a.y, a.z, a.w;
float4 vert (float4 vertex : POSITION):SV_POSITION
{
return UnityObjectToClipPos(vertex);
}
//frag 的返回值 fixed4 是内置向量(r, g, b, a); fixed4 c; color.r, color.g, color.b, color.a;
fixed4 frag () : SV_Target
{
return _Color;
}
ENDCG
}
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务