美文网首页征服Unity3dUnity技术分享Unity3d杂七杂八
UnityShader中扰动图的一些使用方法

UnityShader中扰动图的一些使用方法

作者: Alphazhu | 来源:发表于2017-12-26 16:40 被阅读163次

最近在开资料的时候发现了unityshader中一些扰动图的使用很有趣,这里做个记录,这篇文章主要涉及到两个小案例:

  • 扰动火焰
  • 闪烁灯光

扰动火焰
原理就是通过采样一张扰动图的RG通道,作为UV与MainTex的贴图相加进行偏移,然后通过改变扰动图的offset进行模拟扰动效果,大概效果如下。

关键代码

        v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                o.noise_uv = TRANSFORM_TEX(v.uv, _NoiseTex);
                o.noise_uv.y -= _Time.x;
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 noiseCol = tex2D(_NoiseTex, i.noise_uv);
                half2 noiseuv = {noiseCol.r,noiseCol.g};
                //颜色值是(0,1),而扰动需要(-1,1)
                noiseuv = (noiseuv-0.5)*2;
                fixed4 col = tex2D(_MainTex, i.uv + noiseuv*0.02);
                return col;
            }

闪烁灯光
原理跟火焰的而类似,通过一张扰动图把扰动信息存在RG通道中,与火焰不同的事,火焰干扰的事uv,这个干扰的是颜色。
首先扰动图采样的UV直接用_SinTime函数进行计算,采样完的颜色与MainTex Color进行计算。还可以进行各通道的计算。模拟的效果如下:

关键代码:

v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                float sinTan = _SinTime * 20;
                o.noise_uv = float2(sinTan,sinTan);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 noiseCol = tex2D(_NoiseTex, i.noise_uv);
                fixed4 col = tex2D(_MainTex, i.uv);
                float4 ghjcolor = col.g * saturate(noiseCol.r + _Luminance)*_Color1;
                float4 ghjcolor1 = col.r * noiseCol.g*_Color2;
                float4 main = col.b * _Color3;
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return ghjcolor + ghjcolor1 + main;
            }

这个算法也是来自某插件,实际效果如下:


场景中实际没灯

相关文章

  • UnityShader中扰动图的一些使用方法

    最近在开资料的时候发现了unityshader中一些扰动图的使用很有趣,这里做个记录,这篇文章主要涉及到两个小案例...

  • 5.Unityshader的类型

    在unityshader中我们可以用三种形式来编写unityshader 1. 表面着色器 需要的代码量少,渲染代...

  • UnityShader:入门篇

    今天我们来具体了解UnityShader及ShaderLab。 ShaderLab 学习UnityShader首先...

  • React Native - ActivityIndicator

    系统的指示器ActivityIndicator在Native中的使用方法. 效果图:

  • 更复杂的光照

    Unity的渲染路径 RenderingPath (渲染路径) 决定了光照在UnityShader中的应用,需要为...

  • 扰动

    人是会相互影响的动物。 他人的一句话,一个动作,一个眼神甚或是一个表情,都可能会被详细的解读,心思敏感的人,会赋予...

  • 扰动

    对于一整族群的理想化分析中,会有着无限多的样本,在一个稳定的状态中提炼和简化各式逻辑,用大数定律使得一个确定的世界...

  • 扰动

    水至清则无鱼,把一条鲶鱼放在水里,则会让原来沉寂的状态发生变化。人也一样,会找到一个平衡的点做一些停留。晚上一起吃...

  • ios - 卡片切换效果的封装,易于使用

    本文目录 效果图使用方法实现说明 效果图 使用方法 1. install pod search TABCardVi...

  • viewPager实现显示3个item

    效果图 使用方法:

网友评论

    本文标题:UnityShader中扰动图的一些使用方法

    本文链接:https://www.haomeiwen.com/subject/dshjgxtx.html