Preview will draw SDR white luminance from settings (default 300 nits) when displayed on an HDR monitor rather than CCCS 80 nits.
168 lines
3.5 KiB
Plaintext
168 lines
3.5 KiB
Plaintext
uniform float4x4 ViewProj;
|
|
uniform texture2d image;
|
|
uniform float multiplier;
|
|
|
|
sampler_state def_sampler {
|
|
Filter = Linear;
|
|
AddressU = Clamp;
|
|
AddressV = Clamp;
|
|
};
|
|
|
|
struct VertInOut {
|
|
float4 pos : POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
};
|
|
|
|
VertInOut VSDefault(VertInOut vert_in)
|
|
{
|
|
VertInOut vert_out;
|
|
vert_out.pos = mul(float4(vert_in.pos.xyz, 1.0), ViewProj);
|
|
vert_out.uv = vert_in.uv;
|
|
return vert_out;
|
|
}
|
|
|
|
float4 PSDrawBare(VertInOut vert_in) : TARGET
|
|
{
|
|
return image.Sample(def_sampler, vert_in.uv);
|
|
}
|
|
|
|
float4 PSDrawAlphaDivide(VertInOut vert_in) : TARGET
|
|
{
|
|
float4 rgba = image.Sample(def_sampler, vert_in.uv);
|
|
float alpha = rgba.a;
|
|
float multiplier = (alpha > 0.0) ? (1.0 / alpha) : 0.0;
|
|
return float4(rgba.rgb * multiplier, alpha);
|
|
}
|
|
|
|
float srgb_linear_to_nonlinear_channel(float u)
|
|
{
|
|
return (u <= 0.0031308) ? (12.92 * u) : ((1.055 * pow(u, 1.0 / 2.4)) - 0.055);
|
|
}
|
|
|
|
float3 srgb_linear_to_nonlinear(float3 v)
|
|
{
|
|
return float3(srgb_linear_to_nonlinear_channel(v.r), srgb_linear_to_nonlinear_channel(v.g), srgb_linear_to_nonlinear_channel(v.b));
|
|
}
|
|
|
|
float srgb_nonlinear_to_linear_channel(float u)
|
|
{
|
|
return (u <= 0.04045) ? (u / 12.92) : pow((u + 0.055) / 1.055, 2.4);
|
|
}
|
|
|
|
float3 srgb_nonlinear_to_linear(float3 v)
|
|
{
|
|
return float3(srgb_nonlinear_to_linear_channel(v.r), srgb_nonlinear_to_linear_channel(v.g), srgb_nonlinear_to_linear_channel(v.b));
|
|
}
|
|
|
|
float4 PSDrawNonlinearAlpha(VertInOut vert_in) : TARGET
|
|
{
|
|
float4 rgba = image.Sample(def_sampler, vert_in.uv);
|
|
rgba.rgb = srgb_linear_to_nonlinear(rgba.rgb);
|
|
rgba.rgb *= rgba.a;
|
|
rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
|
|
return rgba;
|
|
}
|
|
|
|
float4 PSDrawSrgbDecompress(VertInOut vert_in) : TARGET
|
|
{
|
|
float4 rgba = image.Sample(def_sampler, vert_in.uv);
|
|
rgba.rgb = srgb_nonlinear_to_linear(rgba.rgb);
|
|
return rgba;
|
|
}
|
|
|
|
float4 PSDrawMultiply(VertInOut vert_in) : TARGET
|
|
{
|
|
float4 rgba = image.Sample(def_sampler, vert_in.uv);
|
|
rgba.rgb *= multiplier;
|
|
return rgba;
|
|
}
|
|
|
|
float3 rec709_to_rec2020(float3 v)
|
|
{
|
|
float r = dot(v, float3(0.6274040f, 0.3292820f, 0.0433136f));
|
|
float g = dot(v, float3(0.0690970f, 0.9195400f, 0.0113612f));
|
|
float b = dot(v, float3(0.0163916f, 0.0880132f, 0.8955950f));
|
|
return float3(r, g, b);
|
|
}
|
|
|
|
float3 rec2020_to_rec709(float3 v)
|
|
{
|
|
float r = dot(v, float3(1.6604910, -0.5876411, -0.0728499));
|
|
float g = dot(v, float3(-0.1245505, 1.1328999, -0.0083494));
|
|
float b = dot(v, float3(-0.0181508, -0.1005789, 1.1187297));
|
|
return float3(r, g, b);
|
|
}
|
|
|
|
float reinhard_channel(float x)
|
|
{
|
|
return x / (x + 1.0);
|
|
}
|
|
|
|
float3 reinhard(float3 rgb)
|
|
{
|
|
return float3(reinhard_channel(rgb.r), reinhard_channel(rgb.g), reinhard_channel(rgb.b));
|
|
}
|
|
|
|
float4 PSDrawTonemap(VertInOut vert_in) : TARGET
|
|
{
|
|
float4 rgba = image.Sample(def_sampler, vert_in.uv);
|
|
rgba.rgb = rec709_to_rec2020(rgba.rgb);
|
|
rgba.rgb = reinhard(rgba.rgb);
|
|
rgba.rgb = rec2020_to_rec709(rgba.rgb);
|
|
return rgba;
|
|
}
|
|
|
|
technique Draw
|
|
{
|
|
pass
|
|
{
|
|
vertex_shader = VSDefault(vert_in);
|
|
pixel_shader = PSDrawBare(vert_in);
|
|
}
|
|
}
|
|
|
|
technique DrawAlphaDivide
|
|
{
|
|
pass
|
|
{
|
|
vertex_shader = VSDefault(vert_in);
|
|
pixel_shader = PSDrawAlphaDivide(vert_in);
|
|
}
|
|
}
|
|
|
|
technique DrawNonlinearAlpha
|
|
{
|
|
pass
|
|
{
|
|
vertex_shader = VSDefault(vert_in);
|
|
pixel_shader = PSDrawNonlinearAlpha(vert_in);
|
|
}
|
|
}
|
|
|
|
technique DrawSrgbDecompress
|
|
{
|
|
pass
|
|
{
|
|
vertex_shader = VSDefault(vert_in);
|
|
pixel_shader = PSDrawSrgbDecompress(vert_in);
|
|
}
|
|
}
|
|
|
|
technique DrawMultiply
|
|
{
|
|
pass
|
|
{
|
|
vertex_shader = VSDefault(vert_in);
|
|
pixel_shader = PSDrawMultiply(vert_in);
|
|
}
|
|
}
|
|
|
|
technique DrawTonemap
|
|
{
|
|
pass
|
|
{
|
|
vertex_shader = VSDefault(vert_in);
|
|
pixel_shader = PSDrawTonemap(vert_in);
|
|
}
|
|
}
|