Страница 1 из 1

Исправление полос на воде.

СообщениеДобавлено: 13 ноя 2018, 17:07
Radiy
Здравствуйте, тут такая ситуация, https://imgur.com/a/wRiscI2 хотелось бы убрать данные полосы на воде, которые затемняют её, либо сделать их более аккуратными, помогите, пожалуйста. Код шейдера:
Синтаксис:
Используется csharp
Shader "Radiy/Water" {
        Properties {
                _Color("Color", Color) = (0,0,0,1)
                _Strength("Strength", Range(0,10)) = 1
                _Frequency("Frequency", Range(0,10)) = 1
                _Speed("Speed", Range(-200, 200)) = 100
                _MainTex ("Base (RGB) TransGloss (A)", 2D) = "white" {}
                _NormalMap ("Normal Map", 2D) = "white" {}
                _Boost("Boost", Float) = 1
                _Transparence("Transparence", Float) = 1
                _A("Albedo", Range(0,1)) = 1
                _WaterTex("Water Texture", 2D) = "white" {}
        }
        SubShader {
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
        LOD 300
        Blend SrcAlpha OneMinusSrcAlpha
        Pass {
                        Cull Off
                        CGPROGRAM
                                #pragma vertex vertexFunc
                                #pragma fragment fragmentFunc
                                #include "UnityCG.cginc"
                                float4 _Color;
                                float _Strength;
                                sampler2D _WaterTex;
                float4 _WaterTex_ST;
                                float _Frequency;
                                float _Boost;
                                float _Speed;
                                float _A;
                                float _Transparence;
                                sampler2D _MainTex;
                                float4 _MainTex_ST;
                                sampler2D _NormalMap;
                                float4 _NormalMap_ST;
                                sampler2D _CameraDepthTexture;
                                float4 _EdgeColor;
                                float  _DepthFactor;
                                sampler2D _DepthRampTex;
                                float rand(float2 n) {
                                    return frac(sin(dot(n, float2(12.9898, 4.1414))) * 43758.5453);
                                }
                                float noise(float2 n) {
                                    const float2 d = float2(0.0, 1.0);
                                    float2 b = floor(n), f = smoothstep(0, 1, frac(n));
                                return lerp(lerp(rand(b), rand(b + d.yx), f.x), lerp(rand(b + d.xy), rand(b + d.yy), f.x), f.y);
                                }
                                struct vertexInput{
                                        float4 vertex : POSITION;
                                        float2 uv : TEXCOORD0;
                                        float2 uv_normal : TEXCOORD1;
                                        half3 normal : NORMAL;
                                        half4 tangent : TANGENT;
                                };
                                struct vertexOutput{
                                        float4 pos : SV_POSITION0;
                                        float2 uv : TEXCOORD0;
                                        float2 uv_normal : TEXCOORD1;
                                        half3 tspace0 : TEXCOORD2;
                    half3 tspace1 : TEXCOORD3;
                    half3 tspace2 : TEXCOORD4;
                    half3 viewDir : TEXCOORD5;
                    half3 normalDir : TEXCOORD6;
                                };
                                vertexOutput vertexFunc(vertexInput IN)
                                {
                                        vertexOutput o;
                                        float4 worldPos = mul(unity_ObjectToWorld, IN.vertex);
                                        //float displacement = (sin(worldPos.y + (_Speed * _Time)) + sin(worldPos.x + (_Speed * _Time)) + sin(worldPos.z + (_Speed * _Time)));
                                        //worldPos.y = worldPos.y +(displacement * _Strength);
                                        float2 samplePos = worldPos.xz;
                        samplePos += _Time.x/1000;
                        float waterSample = tex2Dlod(_WaterTex, float4(samplePos, 0, 0));
                                        float displacement = abs(sin(worldPos.x * rand(2.0) + (_Speed * _Time * waterSample))) + abs(sin(worldPos.z * rand(1.0) + (_Speed * _Time * _Frequency * waterSample)));
                                        float displacement2 = abs(cos(worldPos.x * rand(1.0) + (-_Speed * _Time))) + abs(cos(worldPos.z * rand(2.0) + (_Speed * _Time * _Frequency)));
                                        worldPos.y = worldPos.y + (displacement * _Strength);
                                        worldPos.y = worldPos.y + (displacement2 * _Strength/2);
                                        o.pos = mul(UNITY_MATRIX_VP, worldPos);
                                        o.uv = TRANSFORM_TEX(IN.uv, _MainTex);
                                        o.uv_normal = TRANSFORM_TEX(IN.uv_normal, _NormalMap);
                                        o.viewDir = normalize(ObjSpaceViewDir(IN.vertex));
                    o.normalDir = IN.normal;
                    half3 wNormal = UnityObjectToWorldNormal(IN.normal);
                        half3 wTangent = UnityObjectToWorldDir(IN.tangent.xyz);
                        half tangentSign = IN.tangent.w * unity_WorldTransformParams.w;
                        half3 wBitangent = cross(wNormal, wTangent) * tangentSign;
                        o.tspace0 = half3(wTangent.x, wBitangent.x, wNormal.x);
                        o.tspace1 = half3(wTangent.y, wBitangent.y, wNormal.y);
                        o.tspace2 = half3(wTangent.z, wBitangent.z, wNormal.z);
                                        return o;
                                }
                                float4 fragmentFunc(vertexOutput IN) : SV_Target{
                                        half3 tnormal = UnpackNormal(tex2D(_NormalMap, IN.uv_normal));
                        half3 worldNormal;
                        worldNormal.x = dot(IN.tspace0, tnormal);
                        worldNormal.y = dot(IN.tspace1, tnormal);
                        worldNormal.z = dot(IN.tspace2, tnormal);
                        half3 some = saturate(dot(IN.viewDir, IN.normalDir));
                                        //float4 norms = float4(norm.x, norm.y+_Boost, norm.z, 0);
                                        fixed4 col;
                                        col.rgb = (tex2D(_MainTex, IN.uv) + some) * _Color;
                                        col.a = _Transparence + _A;
                                        return col;
                                }
                        ENDCG
                }
        }
        Fallback "Transparent/VertexLit"
}

Re: Исправление полос на воде.

СообщениеДобавлено: 13 ноя 2018, 18:27
DimaJoke
А тебе не кажется, что это просто прозрачный материал воды накладывается на другую часть воды и по-этому прозрачность становится меньше?

Re: Исправление полос на воде.

СообщениеДобавлено: 14 ноя 2018, 11:27
Radiy
DimaJoke писал(а):А тебе не кажется, что это просто прозрачный материал воды накладывается на другую часть воды и по-этому прозрачность становится меньше?

https://imgur.com/a/j1WEq7t Всё равно полосы остались, всё равно они кривые.