Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- half4 SSAO(v2f i)
- {
- half env = 0;
- half3 viewDir = i.viewDir;
- half4 normalDepth = tex2D(_CameraDepthNormalsTexture, i.uv);
- //viewDir.z = normalDepth.a;
- float3 origin = viewDir * normalDepth.a; // позиция пикселя в пространстве вида
- float4 noiseSample = (tex2D(_NoiseTex, i.uv* 2))* 2.0 - 1.0;
- //normalDepth.a *= _ProjectionParams.z;
- half radius = 1;
- float3 tangent = normalize(noiseSample.xyz - normalDepth.xyz * dot(noiseSample.xyz, normalDepth.xyz));
- float3 bitangent = cross(normalDepth.xyz, tangent);
- float3x3 tbn = float3x3(tangent, bitangent, normalDepth.xyz);
- float z = normalDepth.a;
- //float z = zFar*zNear/(zb * (zFar - zNear) - zFar); // get z-eye
- half3 pe = i.vertex * z / i.vertex.z; // point in eye coordinates
- float att = 0.0;
- half3 plane = 2.0 * noiseSample - half3(1,1,1);
- float acc = 0.0;
- for (int n=0; n<NUM_SAMPLES; n++)
- {
- float3 sample = (reflect(normalDepth.xyz, viewDir)*radius);
- //noiseSample = (tex2D(_NoiseTex, i.uv ));
- //samplePos*= (n+1.0f)/NUM_SAMPLES;
- // так как до сих пор мы работали в пространстве вида, то для нахождения проекции выборки необходимо умножить ее на матрицу проекции
- //float4 shift = mul(UNITY_MATRIX_P, float4(i.uv + radius*sample.xy/z, 1));
- //shift.xy /= shift.w;
- // shift.xy = shift.xy*0.5+0.5;
- // осталось найти z-координату
- float zSample = tex2D(_CameraDepthNormalsTexture, sample.xy/z).a;
- // если точка оказалась за пределами радиуса - она свой вклад почти не вносит. Чтобы переходы не были резкими, проверку на выхожд за границы выполняем плавно, интерполируем через smoothstep, чем дальше - тем меньше
- //float rangeCheck = abs (origin.z - sampleDepth) < radius? 1: 0;
- if ( zSample - z > 0.1 )
- continue;
- float dz = max ( zSample - z, 0.0 ) * 30.0;
- float dist = max ( zSample - z, 0.0 ) / 1;
- float occl = 15 * max ( dist * (2.0 - dist), 0.0 );
- // если сэмпл оказался ниже рассматриваемой точки - значит он ее не затеняет. Иначе - затеняет, это выполняет функция step
- acc += zSample;
- }
- att = clamp ( (att / 8.0 + 2) * 1, 0.0, 1.0 );
- //return 1.0 - (environment / NUM_SAMPLES);
- return 1-(acc/NUM_SAMPLES);
- }
- half4 SSAOno(v2f i)
- {
- half env = 0;
- half3 viewDir = i.viewDir;
- half4 normalDepth = tex2D(_CameraDepthNormalsTexture, i.uv);
- //viewDir.z = normalDepth.a;
- float3 origin = viewDir * normalDepth.a; // позиция пикселя в пространстве вида
- float4 noiseSample = (tex2D(_NoiseTex, i.uv* 2))* 2.0 - 1.0;
- //normalDepth.a *= _ProjectionParams.z;
- half radius = 1;
- float3 tangent = normalize(noiseSample.xyz - normalDepth.xyz * dot(noiseSample.xyz, normalDepth.xyz));
- float3 bitangent = cross(normalDepth.xyz, tangent);
- float3x3 tbn = float3x3(tangent, bitangent, normalDepth.xyz);
- float acc = 0.0;
- for (int n=0; n<NUM_SAMPLES; n++)
- {
- //noiseSample = (tex2D(_NoiseTex, i.uv ));
- float3 samplePos = mul(tbn , _Kernel[n]); //поворачиваем выборку
- samplePos = samplePos*radius+origin; //ограничиваем заданным радиусом и переносим в рассматриваемую точку
- //samplePos*= (n+1.0f)/NUM_SAMPLES;
- //float3 shift = reflect(normalDepth.xyz, _Kernel[n]);
- // так как до сих пор мы работали в пространстве вида, то для нахождения проекции выборки необходимо умножить ее на матрицу проекции
- float4 shift = mul(UNITY_MATRIX_P, float4(samplePos, 1));
- shift.xy /= shift.w;
- shift.xy = shift.xy*0.5+0.5;
- // осталось найти z-координату
- float sampleDepth = tex2D(_CameraDepthNormalsTexture, shift.xy).a;
- // если точка оказалась за пределами радиуса - она свой вклад почти не вносит. Чтобы переходы не были резкими, проверку на выхожд за границы выполняем плавно, интерполируем через smoothstep, чем дальше - тем меньше
- float rangeCheck = abs (origin.z - sampleDepth) < radius? 1: 0;
- // если сэмпл оказался ниже рассматриваемой точки - значит он ее не затеняет. Иначе - затеняет, это выполняет функция step
- acc += sampleDepth;
- }
- //return 1.0 - (environment / NUM_SAMPLES);
- return 1-(acc/NUM_SAMPLES);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement