这个系列主要是通过阅读《Unity Shader入门精要》之后的一些感想,给读者一些启发。
联系邮箱:glasirius@gmail.com
ShaderLab的调试并不方便,在Unity中可以打一个PC包,通过VS的图形调试工具进行断点。
在ShaderLab代码的编写上,可以在VS的工具扩展中搜索到ShaderlabVSCode插件进行辅助。
有时候,主要是在处理法线纹理跟光照模型的时候,会用到TNB坐标系,也就是所谓的切线空间。
TNB的三个坐标轴,tangent,normal,binormal。由于历史原因,binormal跟bitangent是一回事。
当然有时候为了方便调试,会将数值通过颜色来反映。
其实也有一些CG的IDE可以用来做简单调试。
Shader "Unity Shaders Book/ Test / Chapter 5/False Color"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float4 pos:SV_POSITION;
float4 color:COLOR;
};
//appdata_full是unity提供的数据结构
// struct appdata_full {
// float4 vertex : POSITION;
// float4 tangent : TANGENT;
// float3 normal : NORMAL;
// float4 texcoord : TEXCOORD0;
// float4 texcoord1 : TEXCOORD1;
// float4 texcoord2 : TEXCOORD2;
// float4 texcoord3 : TEXCOORD3;
// fixed4 color : COLOR;
// UNITY_VERTEX_INPUT_INSTANCE_ID
// };
v2f vert(appdata_full i)
{
v2f o;
o.pos = UnityObjectToClipPos(i.vertex);
o.color = i.tangent;
o.color = float4(i.normal,1);
o.color = i.texcoord;
//i.tangent.w在OpenGL中是+1,在DirectX中是-1
//原因就是两个库中的纹理坐标的v方向相反
float3 biNormal = cross(i.normal,i.tangent.xyz)*i.tangent.w;
o.color = float4(biNormal,1);
return o;
}
float4 frag(v2f i):SV_TARGET
{
float4 o;
o = i.color;
return o;
}
ENDCG
}
}
}