今天接到个需求,做一个球形的烟雾,让3D场景自己在场景里去摆放,贴图不是4方连续的,所以看上去有接缝哈,具体的让特效自己去调效果了:
遇到了一个从来都没注意过的问题,做了一个球形的烟雾,用了边缘透明的方式,同时用了Cull Off,但是无论如何都无法显示背面,找到了原因,在此记录一下。
shader代码如下:
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "effects/Smoke"{
Properties {
_MainTex ("Base layer (RGB)", 2D) = "white" {}
_ScrollX ("Base layer Scroll speed X", Float) = 1.0
_ScrollY ("Base layer Scroll speed Y", Float) = 0.0
_brightness ("brightness", Float) = 2.0
_color("color",color) = (1,1,1,1)
}
SubShader {
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
pass {
Zwrite Off
Cull Off
Blend SrcAlpha OneMinusSrcAlpha
LOD 100
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
float _ScrollX;
float _ScrollY;
float _brightness;
fixed4 _color;
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
fixed4 color : COLOR;
};
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed4 color : TEXCOORD1;
float NdotV :TEXCOORD2;
};
v2f vert (appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord.xy,_MainTex) + frac(float2(_ScrollX, _ScrollY) * _Time);
o.color = v.color;
float3 Normal =UnityObjectToWorldNormal( v.normal);
float3 ViewDir =normalize( WorldSpaceViewDir( v.vertex));
o.NdotV =pow (abs(dot (Normal,ViewDir)),3);
return o;
}
fixed4 frag (v2f i) : COLOR
{
fixed4 tex = tex2D (_MainTex, i.uv);
fixed4 o = tex * i.color * _brightness * _color;
o.a = tex.r * i.color.a * i.NdotV;
return o;
}
ENDCG
}
}
}
saturate 与 abs
o.NdotV =pow (saturate(dot (Normal,ViewDir)),3);
这里刚开始用了saturate,结果怎么都不显示双面,折腾了好久,师傅告诉我,saturate不是这么用的
saturate返回是0到1,而小于0的时候,也就是物体的背面,他永远是返回0
abs 返回的是绝对值,他才可以把物体背面的法线由负方向变成正常向
亲,如果您觉得本文不错,愿意给我一些动力的话,请用手机扫描二维码即可向我打赏