第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > shader之——球形烟雾 CG函数saturate与abs的用法

shader之——球形烟雾 CG函数saturate与abs的用法

时间:2018-11-26 21:51:34

相关推荐

shader之——球形烟雾 CG函数saturate与abs的用法

今天接到个需求,做一个球形的烟雾,让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 OneMinusSrcAlphaLOD 100CGPROGRAM#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 返回的是绝对值,他才可以把物体背面的法线由负方向变成正常向

亲,如果您觉得本文不错,愿意给我一些动力的话,请用手机扫描二维码即可向我打赏

打赏

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。