150 lines
3.6 KiB
HLSL
150 lines
3.6 KiB
HLSL
Texture2D<float4> ColorTexture : register(t0, space2);
|
|
SamplerState Sampler0 : register(s0, space2);
|
|
|
|
Texture2D<float4> EmissiveTexture : register(t1, space2);
|
|
SamplerState Sampler1 : register(s1, space2);
|
|
|
|
Texture2D<float4> SsaoTexture : register(t2, space2);
|
|
SamplerState Sampler2 : register(s2, space2);
|
|
|
|
float3 reinhard2(float3 x) {
|
|
const float L_white = 10.0;
|
|
|
|
const float3 a = 1.0 + x / (L_white * L_white);
|
|
const float3 x2 = x * a;
|
|
const float3 x3 = 1.0 + x;
|
|
return x2 / x3;
|
|
}
|
|
|
|
float3 blurSSAO(float2 uv)
|
|
{
|
|
const float offset[5] = {0.0, 1.0, 2.0, 3.0, 4.0};
|
|
const float weight[5] = {0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162};
|
|
|
|
float3 c = float3(0,0,0); // SsaoTexture.Sample(Sampler2, uv).xyz * weight[0] / 25;
|
|
|
|
for(int j = 0; j < 5; j++ )
|
|
{
|
|
for(int i = 0; i < 5; i++ )
|
|
{
|
|
{
|
|
float2 uv2 = uv + float2(j - 2.5, i) / 1024;
|
|
float3 s = SsaoTexture.Sample(Sampler2, uv2).xyz / 50;
|
|
c += s;
|
|
}
|
|
|
|
{
|
|
float2 uv2 = uv - float2(j - 2.5, i) / 1024;
|
|
float3 s = SsaoTexture.Sample(Sampler2, uv2).xyz / 50;
|
|
c += s;
|
|
}
|
|
}
|
|
}
|
|
|
|
return c;
|
|
}
|
|
|
|
float3 blur(float2 uv)
|
|
{
|
|
const float offset[5] = {0.0, 1.0, 2.0, 3.0, 4.0};
|
|
const float weight[5] = {0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162};
|
|
|
|
float3 c = EmissiveTexture.Sample(Sampler1, uv).xyz * weight[0];
|
|
|
|
for(int j = 0; j < 5; j++ )
|
|
{
|
|
for(int i = 0; i < 5; i++ )
|
|
{
|
|
{
|
|
float2 uv2 = uv + float2(j - 2.5, i) / 512;
|
|
float3 s = EmissiveTexture.Sample(Sampler1, uv2).xyz / 25;
|
|
c += s;
|
|
}
|
|
|
|
{
|
|
float2 uv2 = uv - float2(j - 2.5, i) / 512;
|
|
float3 s = EmissiveTexture.Sample(Sampler1, uv2).xyz / 25;
|
|
c += s;
|
|
}
|
|
#if 0
|
|
{
|
|
float2 uv2 = uv + float2(0.0, offset[i]) / 1024;
|
|
float3 s = EmissiveTexture.Sample(Sampler1, uv2).xyz * weight[i];
|
|
c += s;
|
|
}
|
|
|
|
{
|
|
float2 uv2 = uv - float2(0.0, offset[i]) / 1024;
|
|
float3 s = EmissiveTexture.Sample(Sampler1, uv2).xyz * weight[i];
|
|
c += s;
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
float4 main(float2 UV : TEXCOORD0) : SV_Target0
|
|
{
|
|
float2 uv = UV;
|
|
uv.y *= -1;
|
|
uv.y += 1.0;
|
|
|
|
float3 c;
|
|
|
|
#if 0
|
|
{
|
|
c = ColorTexture.Sample(Sampler0, uv).xyz;
|
|
c = reinhard2(c);
|
|
c = pow(c, 1.0/2.2);
|
|
}
|
|
#endif
|
|
|
|
c = ColorTexture.Sample(Sampler0, uv).xyz;
|
|
c = reinhard2(c);
|
|
|
|
float3 b = float3(0.0, 0.0, 0.0);
|
|
|
|
if(length(c) < 1.0)
|
|
{
|
|
b = blur(uv) * 0.3;
|
|
}
|
|
|
|
c = pow(c, 1.0/2.2);
|
|
|
|
float3 e = EmissiveTexture.Sample(Sampler1, uv).xyz;
|
|
|
|
c = c + blur(uv) * 0.05;
|
|
|
|
float exposure = 1.0;
|
|
c *= exposure; //= exposure(c, 1.0, 0.3);
|
|
|
|
// c = blur(uv) * 0.01;
|
|
|
|
// c = float3(1.0, 1.0, 1.0) - (step(0.91, length(float3(1.0, 1.0, 1.0) - (e - c))));
|
|
// c = c * c ;
|
|
// c = e;
|
|
|
|
// c = float3(uv.x, uv.y, 0.0);
|
|
|
|
// c = SsaoTexture.Sample(Sampler2, uv).x;
|
|
// float4 ssao = SsaoTexture.Sample(Sampler2, uv);
|
|
|
|
float ssao = blurSSAO(uv);
|
|
c = c * ssao;
|
|
|
|
//float4 x = SsaoTexture.Sample(Sampler2, uv);
|
|
//c = x;
|
|
|
|
// c = float3(ssao, ssao, ssao);
|
|
|
|
c.x *= 1.0 + 0.000001 * EmissiveTexture.Sample(Sampler1, uv).x;
|
|
c.x *= 1.0 + 0.000001 * ColorTexture.Sample(Sampler0, uv).x;
|
|
c.x *= 1.0 + 0.000001 * SsaoTexture.Sample(Sampler2, uv).x;
|
|
|
|
|
|
return float4(c, 1.0);
|
|
}
|