小结
反思:晚上看比赛去了。浪费的挺多时间。RNG加油!!(我怎么就管不住啊。)
上午的时候,继续遮罩纹理的收尾,以及透明效果的开头。
透明效果主要是,透明度测试和透明度混合。这两块。当然对于渲染顺序在透明效果中的影响也是非常要重视的。感觉关于渲染队列的具体使用,可能还需要加留心。此外在今天透明测试时,发现虽然是很简单的代码,却没有得到预期的效果,我开始希望自己能够独立的解决这个问题,但是仔细分析(第一次觉得是clip函数的问题;第二次觉得是片元着色器输出时将fixed4 的W变量的取值问题)最后实在没有发现,对着书才找到了是透明阈值参数定义时没有考虑精度的问题。非常细节,却十分致命,这次我是对着书一步一步比对,以后如果没有参考,哪怎么办?
我觉得在之后的学习中,应该有意识的锻炼排错的能力,减少对书上代码的依赖。
//警告,虽然很简单但是 _Cutoff 一定要小心 函数内声明的时候 float 和float4 的问题
//如果是float4 那么在用采样获得的Alpha通道的值减去 cutoff时,标量向上转型,最后得到的结果,是一个float4类型
//永远不会小于0
Shader “Unlit/Alpha Test”
{
Properties
{
_Color(“Color”,Color)=(1,1,1,1)
_MainTex(“MainTex”,2D) = “white”{}
_Cutoff(“AlphaCutoff”,Range(0,1)) = 0.5
}
SubShader
{ Tags{"Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout"}
Pass
{ Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "Lighting.cginc"
#include "UnityCG.cginc"
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
float _Cutoff;
struct appdata
{
fixed4 vertex : POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
};
struct v2f
{
fixed4 pos : SV_POSITION;
float2 uv:TEXCOORD0;
float3 worldNormal:TEXCOORD1;
float3 worldPos:TEXCOORD2;
};
v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
fixed4 texColor = tex2D(_MainTex,i.uv); //采样
clip(texColor.a - _Cutoff); //透明度测试
float3 albent = texColor.rgb*_Color.rgb; // 纹素
float3 ambient = UNITY_LIGHTMODEL_AMBIENT * albent;
fixed3 diffuse = _LightColor0.rgb*albent*max(0, dot(worldNormal, worldLightDir));
return fixed4(diffuse + ambient,1 );
}
ENDCG
}
}Fallback "Transparent/Cutout/VertexLit"
}
透明度混合仅仅是修改了队列参数,将clip函数去掉,修改了片元着色器的返回值,改动很小。不过对于blend命令可能还是不太清楚。明天继续吧