Search Unity

Bug A problem with "Ghosting" when using Alpha-Blend in Raymarched Shader

Discussion in 'Shaders' started by Arternum, Jul 29, 2022.

  1. Arternum

    Arternum

    Joined:
    Dec 18, 2021
    Posts:
    1
    As the title says. I was writing a Raymarch shader using Jittering for optimization, but for some reason I have such a strange artifact happening ... What should I do, how could I fix it?
    I need help badly, can't solve this issue :(



    Code (CSharp):
    1. Shader "Unlit/mySphere"
    2. {
    3.     Properties
    4.     {
    5.         [Toggle] Tex("Use Texture?", float) = 0
    6.         _MainTex ("Texture", 2D) = "white" {}
    7.         _SphereCenterRadius("Sphere Center/Radius", Vector) = (0,0,0,0.5)
    8.         MaxDist ("MaxDist", Range(0.0,100)) = 1
    9.         MaxSteps ("MaxSteps", Range(0.0,100)) = 10
    10.         StepSize ("StepSize", Range(0.0,1)) = 0.01
    11.         JitterRandomness ("Jitter Randomness", Range(0,10)) = 0.1
    12.         NTextMul ("Noise Texture Multp.", Range(0, 1)) = 1
    13.     }
    14.     SubShader
    15.     {
    16.         Tags { "RenderType"="Opaque" }
    17.         Blend SrcAlpha OneMinusSrcAlpha
    18.         Cull Off Lighting Off /*ZWrite Off*/
    19.         ZTest Always
    20.  
    21.         Pass
    22.         {
    23.             CGPROGRAM
    24.             #pragma vertex vert
    25.             #pragma fragment frag
    26.             #include "UnityCG.cginc"
    27.            
    28.             sampler2D _MainTex;
    29.             float4 _MainTex_ST;
    30.             float MaxDist;
    31.             int MaxSteps;
    32.             float StepSize;
    33.             float4 _SphereCenterRadius;
    34.             float JitterRandomness, NTextMul;
    35.             float Tex;
    36.  
    37.             struct VertexData
    38.             {
    39.                 float4 vertex : POSITION;
    40.                 float2 uv : TEXCOORD0;
    41.             };
    42.  
    43.             struct v2f
    44.             {
    45.                 float2 uv : TEXCOORD0;
    46.                 float4 vertex : SV_POSITION;
    47.                 float3 ro : TEXCOORD1; //Cam pos
    48.                 float3 rd : TEXCOORD2;
    49.                 float3 hitPos : TEXCOORD3;
    50.             };
    51.  
    52.             v2f vert (VertexData v)
    53.             {
    54.                 v2f o;
    55.                 o.vertex = UnityObjectToClipPos(v.vertex);
    56.                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    57.  
    58.                 //o.ro = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1));
    59.                 o.ro = _WorldSpaceCameraPos;
    60.                 //o.hitPos = v.vertex;
    61.                 o.hitPos = mul(unity_ObjectToWorld, v.vertex);
    62.  
    63.                 return o;
    64.             }
    65.  
    66.             float3 GetNormal(float3 p){
    67.                 float2 offset = float2(0.0001, 0);
    68.                 float3 n = length(p) - float3(
    69.                     length(p-offset.xyy),
    70.                     length(p-offset.yxy),
    71.                     length(p-offset.yyx)
    72.                     );
    73.                 return normalize(n);
    74.             }
    75.  
    76.             float Rand(float2 uv)
    77.             {
    78.                 float noiseX = frac(sin(dot(uv, float2(12.9898,78.233) * 2.0)) * 43758.5453);
    79.                 return noiseX*StepSize;
    80.             }
    81.             float RandT(float2 uv)
    82.             {
    83.                 return tex2D(_MainTex, -uv/NTextMul)*StepSize*JitterRandomness;
    84.             }
    85.  
    86.             float3 RaymarchHit(float3 ro, float3 rd, float2 uv)
    87.             {
    88.                 float roJitterT = RandT(-rd.yx);
    89.                 float roJitter = Rand(uv);
    90.  
    91.                 float3 d = ro;
    92.                 float3 ran = d;
    93.                 float3 roJittered = ro + (rd * roJitter);
    94.                 for(int i = 0; i <= MaxSteps; i++)
    95.                 {
    96.                     if (distance(roJittered, _SphereCenterRadius.xyz) < _SphereCenterRadius.w)
    97.                         return roJittered;
    98.                     d += rd * StepSize;
    99.                     if(Tex == true){
    100.                         roJittered = d + (rd * roJitterT);
    101.                     }
    102.                     else{
    103.                         roJittered = d + (rd * roJitter);
    104.                     }
    105.                    
    106.                 }
    107.                 return float3(0,0,0);
    108.             }
    109.  
    110.             float4 frag (v2f i) : SV_Target
    111.             {
    112.                 float4 col = 0;
    113.                 float3 ro = i.ro;
    114.                 float3 rd = normalize(i.hitPos - ro);
    115.                 float2 uv = i.uv;
    116.                 float3 depth = RaymarchHit(ro, rd, uv); //The distance to the raymarching object (depth)
    117.              
    118.                 if(length(depth) != 0){
    119.                     float3 p = ro + rd * depth;
    120.                     float3 sphrNorm = depth - float3(0,0,0);//GetNormal(p);
    121.                     float d0t = dot(sphrNorm, _WorldSpaceLightPos0.xyz);
    122.                    
    123.                     col = float4(1*d0t,1*d0t,1*d0t, 1);
    124.                 }else {
    125.                     col.a = 0;
    126.                     col.rgb = 0;
    127.                 }
    128.                    
    129.                 return col;
    130.             }
    131.             ENDCG
    132.         }
    133.     }
    134. }
    135.