水模拟

作者: 代码记录器 | 来源:发表于2018-07-27 11:44 被阅读0次
Shader "MyShader/flag"

{

    Properties

    {

        _MainTex ("Main Tex", 2D) = "white" {}

        _Color ("Color Tint", Color) = (1,1,1,1)

        _Magnitude ("Distortion Magnitude", Float) = 1

        _Frequency ("Distortion Frequency", Float) = 1

        _InvWaveLength ("Distortion Inverse Wave Length", Float) = 10

        _Speed ("Speed", Float) = 0.5

        _Diffuse ("Diffuse", Color) = (1.0,1.0,1.0,1.0)

    }

    SubShader

    {

        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "DisableBatching"="True"}

        Pass

        {

            Tags {"LightMode"="ForwardBase"}

            ZWrite Off

            Blend SrcAlpha OneMinusSrcAlpha

            Cull Off

            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag

            #include "Lighting.cginc"

            sampler2D _MainTex;

            float4 _MainTex_ST;

            fixed4 _Color;

            float _Magnitude;

            float _Frequency;

            float _InvWaveLength;

            float _Speed;

            fixed4 _Diffuse;

            struct a2v {

                float4 vertex : POSITION;

                float3 normal : NORMAL;

                float4 texcoord : TEXCOORD0;

            };

            struct v2f {

                float4 pos : SV_POSITION;

                float2 uv : TEXCOORD0;

                fixed3 worldNormal : TEXCOORD1;

            };

            float calPositionRate(float2 uv) {

                float t = 0;

                if(uv.x >= 0.5f)

                    t += (1 - uv.x);

                else

                    t += uv.x;

                if(uv.y >= 0.5f)

                    t += (1 - uv.y);

                else

                    t += uv.y;

                return t;

            }

            v2f vert(a2v v) {

                v2f o;

//                offset.x = sin(_Frequency * _Time.y + v.vertex.x * _InvWaveLength + v.vertex.y * _InvWaveLength + v.vertex.z * _InvWaveLength) * _Magnitude;

//                offset.x = sin(v.vertex.x * _InvWaveLength);

//                offset.x = sin((_Time.y * _Frequency + v.vertex.z * _InvWaveLength) * 5) * _Magnitude;

                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

//                o.uv += float2(0.0, _Time.y * _Speed);

                float4 offset;

                offset.xyw = float3(0.0,0.0,0.0);

                offset.z = 1 * sin((_Time.y * _Frequency + v.vertex.x * _InvWaveLength) * 5) * _Magnitude * clamp(sin(_Time.y * 0.2) , 0.25, 0.75);

                o.pos = UnityObjectToClipPos(v.vertex + offset);

                // cal v.normal

                float t = 1 * cos((_Time.y * _Frequency + v.vertex.x * _InvWaveLength) * 5) * _Magnitude * clamp(sin(_Time.y * 0.2) , 0.25, 0.75) * 5 * _InvWaveLength;

                float3 nor = normalize(cross(float4(v.vertex.x, 0, t,0), float4(0,1.0,0,0)));

//                if(nor.z < 0) {

//                    nor.z *= -1;

//                    nor.x *= -1;

//                    nor.y *= -1;

//                }

//                float3 nor3 = float3(0, 0, nor.z);

                o.worldNormal = mul(nor , (float3x3)unity_WorldToObject);

//                o.pos = UnityObjectToClipPos(v.vertex);

                return o;

            }

            fixed4 frag(v2f i) : SV_Target {

                fixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Color.rgb;

                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

                fixed3 worldNormal = normalize(i.worldNormal);

                fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);

                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * pow(saturate(dot(worldNormal, worldLightDir)),8);;

                fixed3 color = ambient + diffuse;

                return fixed4(color, 1.0);

            }

            ENDCG

        }

    }

    FallBack "VertexLit"

}

1.表面网格的几何波动

2.网格上的法线扰动

水的高度由简单的周期波叠加而成,通过正弦函数叠加后得到的连续函数,描述水面上所有点的高度和方向。

对于2d水平面的任何点(x,y)副法线B和切线T分别是x和y方向的偏导数 由副法线和切线的叉积获取出该点的法线方向

遗留问题:1.我想在片段函数中计算法线 这样的话发现计算的就更精确 但是没有计算出来
2.在片段函数中我想弱化光照边缘的强度 使用了pow进行n次方操作 为什么整体强度变暗了

相关文章

  • 水模拟

    1.表面网格的几何波动 2.网格上的法线扰动 水的高度由简单的周期波叠加而成,通过正弦函数叠加后得到的连续函数,描...

  • 水动力学和水质 河流湖泊及河口数值模拟 季振刚著

    水动力学和水质 河流湖泊及河口数值模拟 季振刚著 《水动力学和水质:河流、湖泊及河口数值模拟》中阐述了地表水的理论...

  • 水阻划船机

    水阻划船器(waterrower),又叫水划船器、水阻力划船器,是划船器的一种,它模拟真实划船方式,打造真实划水的...

  • 母爱

    没错,我把我模拟考的满分作文用来水。 水呀水~水呀水~ 细心观察这个奇妙的世界,你就会发现,母爱并不仅限于人。 2...

  • Leetcode Contest 131

    1021. Remove Outermost Parentheses 水题,直接模拟就可以 1022. Sum o...

  • 水木财经模拟炒股大赛细节遭提前曝光

    继各大财经网站平台火热推出实盘炒股、模拟炒股大赛之后,据知情人爆料,2017年水木财经隆重策划出模拟炒股大赛活动,...

  • 第二章:状态模式

    一、什么是状态模式 故事水(H2O)有三种状态,冰(固态)、水(液态)、水蒸气(气态) 1.1 模拟状态 对象始终...

  • Paper rough reading(三)

    使用AquaCrop模型模拟气候波动对水稻灌溉水需求的影响 Simulating the effects of c...

  • 分子模拟DCD文件去水

    去掉水的步骤: 在VMD Tk consle中先用 把蛋白质和DNA的index得到,保存为protein_DNA...

  • Mike Zero

    Mike Zero 主要用来地表水模拟,其中包含很多单独组件。Mike Zero 与 Microsoft Visu...

网友评论

      本文标题:水模拟

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