Advertisement
Guest User

Untitled

a guest
Dec 19th, 2020
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. half4 SSAO(v2f i)
  2.             {
  3.                 half env = 0;
  4.                 half3 viewDir = i.viewDir;
  5.                 half4 normalDepth = tex2D(_CameraDepthNormalsTexture, i.uv);
  6.                 //viewDir.z = normalDepth.a;
  7.                 float3 origin = viewDir * normalDepth.a;  // позиция пикселя в пространстве вида
  8.                 float4 noiseSample  = (tex2D(_NoiseTex, i.uv* 2))* 2.0 - 1.0;
  9.                  //normalDepth.a *= _ProjectionParams.z;
  10.                 half radius = 1;
  11.  
  12.                 float3 tangent = normalize(noiseSample.xyz - normalDepth.xyz * dot(noiseSample.xyz, normalDepth.xyz));
  13.                 float3 bitangent = cross(normalDepth.xyz, tangent);
  14.                 float3x3 tbn  = float3x3(tangent, bitangent, normalDepth.xyz);
  15.  
  16.                 float   z  = normalDepth.a;
  17.                 //float   z     = zFar*zNear/(zb * (zFar - zNear) - zFar);          // get z-eye
  18.                 half3    pe    = i.vertex * z / i.vertex.z;                                  // point in eye coordinates
  19.                 float   att   = 0.0;
  20.                 half3    plane = 2.0 * noiseSample - half3(1,1,1);
  21.  
  22.                 float acc = 0.0;
  23.                 for (int n=0; n<NUM_SAMPLES; n++)
  24.                 {
  25.                     float3 sample = (reflect(normalDepth.xyz, viewDir)*radius);
  26.  
  27.                     //noiseSample  = (tex2D(_NoiseTex, i.uv ));
  28.  
  29.                     //samplePos*= (n+1.0f)/NUM_SAMPLES;
  30.                     // так как до сих пор мы работали в пространстве вида, то для нахождения проекции выборки необходимо умножить ее на матрицу проекции
  31.                     //float4 shift = mul(UNITY_MATRIX_P, float4(i.uv + radius*sample.xy/z, 1));
  32.                     //shift.xy /= shift.w;
  33.                    // shift.xy = shift.xy*0.5+0.5;
  34.                     // осталось найти z-координату
  35.                     float zSample = tex2D(_CameraDepthNormalsTexture,  sample.xy/z).a;
  36.                     // если точка оказалась за пределами радиуса - она свой вклад почти не вносит. Чтобы переходы не были резкими, проверку на выхожд за границы выполняем плавно, интерполируем через smoothstep, чем дальше - тем меньше
  37.                     //float rangeCheck = abs (origin.z - sampleDepth) < radius? 1: 0;
  38.                      if ( zSample - z > 0.1 )
  39.                         continue;
  40.                       float   dz = max ( zSample - z, 0.0 ) * 30.0;
  41.  
  42.                     float  dist = max ( zSample - z, 0.0 ) / 1;    
  43.                     float   occl = 15 * max ( dist * (2.0 - dist), 0.0 );
  44.                     // если сэмпл оказался ниже рассматриваемой точки - значит он ее не затеняет. Иначе - затеняет, это выполняет функция step
  45.                     acc +=  zSample;
  46.                 }
  47.                     att = clamp ( (att / 8.0 + 2) * 1, 0.0, 1.0 );
  48.  
  49.                 //return 1.0 - (environment / NUM_SAMPLES);
  50.                 return 1-(acc/NUM_SAMPLES);
  51.             }
  52.  
  53.             half4 SSAOno(v2f i)
  54.             {
  55.                 half env = 0;
  56.                 half3 viewDir = i.viewDir;
  57.                 half4 normalDepth = tex2D(_CameraDepthNormalsTexture, i.uv);
  58.                 //viewDir.z = normalDepth.a;
  59.                 float3 origin = viewDir * normalDepth.a;  // позиция пикселя в пространстве вида
  60.                 float4 noiseSample  = (tex2D(_NoiseTex, i.uv* 2))* 2.0 - 1.0;
  61.                  //normalDepth.a *= _ProjectionParams.z;
  62.                 half radius = 1;
  63.  
  64.                 float3 tangent = normalize(noiseSample.xyz - normalDepth.xyz * dot(noiseSample.xyz, normalDepth.xyz));
  65.                 float3 bitangent = cross(normalDepth.xyz, tangent);
  66.                 float3x3 tbn  = float3x3(tangent, bitangent, normalDepth.xyz);
  67.  
  68.                 float acc = 0.0;
  69.                 for (int n=0; n<NUM_SAMPLES; n++)
  70.                 {
  71.                     //noiseSample  = (tex2D(_NoiseTex, i.uv ));
  72.                     float3 samplePos = mul(tbn , _Kernel[n]); //поворачиваем выборку
  73.                     samplePos = samplePos*radius+origin; //ограничиваем заданным радиусом и переносим в рассматриваемую точку
  74.                     //samplePos*= (n+1.0f)/NUM_SAMPLES;
  75.                     //float3 shift = reflect(normalDepth.xyz, _Kernel[n]);
  76.                     // так как до сих пор мы работали в пространстве вида, то для нахождения проекции выборки необходимо умножить ее на матрицу проекции
  77.                     float4 shift = mul(UNITY_MATRIX_P, float4(samplePos, 1));
  78.                     shift.xy /= shift.w;
  79.                     shift.xy = shift.xy*0.5+0.5;
  80.                     // осталось найти z-координату
  81.                     float sampleDepth = tex2D(_CameraDepthNormalsTexture, shift.xy).a;
  82.                     // если точка оказалась за пределами радиуса - она свой вклад почти не вносит. Чтобы переходы не были резкими, проверку на выхожд за границы выполняем плавно, интерполируем через smoothstep, чем дальше - тем меньше
  83.                     float rangeCheck = abs (origin.z - sampleDepth) < radius? 1: 0;
  84.                     // если сэмпл оказался ниже рассматриваемой точки - значит он ее не затеняет. Иначе - затеняет, это выполняет функция step
  85.                     acc += sampleDepth;
  86.                 }
  87.  
  88.                 //return 1.0 - (environment / NUM_SAMPLES);
  89.                 return 1-(acc/NUM_SAMPLES);
  90.             }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement