编辑器使用的是VSCODE,unity自带的vs2019写shader太tm痛苦了,简直能从入门到放弃。
这是我跟着大佬们装的插件,可能有些用不上。但是目前来说没什么毛病。
首先是根据ShaderForge,作出最简Shader模板,然后在最简模板的基础上去添加计算。来达到想要的效果。
Shader "Shader Forge/EasiestShader" {//路径名
Properties {//材质面板参数
}
SubShader {
Tags {
"RenderType"="Opaque"
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
CGPROGRAM
//顶点变量
#pragma vertex vert
//像素变量
#pragma fragment frag
//目前阶段个人理解,shader就是给上方两个变量赋值。用结构体VertexInput描述物体在本身层面的一些属性信息,再用VertexOutput vert (VertexInput v)方法根据输入结构计算出输出结构。
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
struct VertexInput {//输入结构
float4 vertex : POSITION;//将模型顶点信息输入进来
};
struct VertexOutput {//输出结构
float4 pos : SV_POSITION;//由模型顶点信息换算而来的顶点屏幕位置
};
VertexOutput vert (VertexInput v) {//顶点shader
VertexOutput o = (VertexOutput)0;//新建一个输出结构
o.pos = UnityObjectToClipPos( v.vertex );//变换顶点信息,并将其赋值给输出结构
return o;//将输出结构输出
}
float4 frag(VertexOutput i) : COLOR {//像素shader
return fixed4(1.0,0.0,0.0,1.0);//RGBA 输出为红色
}
ENDCG
}
}
FallBack "Diffuse"
}
最简模板输出一颗红桔子 ,然后加入一点计算的代码,制作一个兰伯特光照模型
Shader "Shader Forge/EasiestShader" {//路径名
Properties {//材质面板参数
}
SubShader {
Tags {
"RenderType"="Opaque"
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
CGPROGRAM
//顶点变量
#pragma vertex vert
//像素变量
#pragma fragment frag
//目前阶段个人理解,shader就是给上方两个变量赋值。用结构体VertexInput描述物体在本身层面的一些属性信息,再用VertexOutput vert (VertexInput v)方法根据输入结构计算出输出结构。
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
struct VertexInput {//输入结构
float4 vertex : POSITION;//将模型顶点信息输入进来
float3 normal: NORMAL;//将法线信息输入进来
};
struct VertexOutput {//输出结构
float4 pos : SV_POSITION;//由模型顶点信息换算而来的顶点屏幕位置
float3 nDirWS:TEXCOORD0;//由模型法线信息换算而来的世界空间法线信息
};
VertexOutput vert (VertexInput v) {//顶点shader
VertexOutput o = (VertexOutput)0;//新建一个输出结构
o.pos = UnityObjectToClipPos( v.vertex );//变换顶点信息,并将其赋值给输出结构
o.nDirWS=UnityObjectToWorldNormal(v.normal);//变换法线信息,并将其赋值给输出结构
return o;//将输出结构输出
}
float4 frag(VertexOutput i) : COLOR {//像素shader
float3 nDir=i.nDirWS;
float3 lDir=_WorldSpaceLightPos0.xyz;//光方向
float nDot1=dot(i.nDirWS,lDir);//点乘算出兰伯特
float lambert=max(0.0,nDot1);//兰伯特明暗钳制
return fixed4(lambert,lambert,lambert,1.0);
//return lambert;这样也不会报错,但是安全期间还是输出四维向量
}
ENDCG
}
}
FallBack "Diffuse"
}
兰伯特桔子完成!
(PS:我是跟着B站大佬,庄懂的视屏学习的。感谢大佬的视屏)



