mirror of https://github.com/987123879113/mame
HLSL Color Transforms and 3D LUT (#4043)
* Remove broken scanline uniform from post_pass * Add 3D LUT to HLSL * Allow individual LUTs for screen and UI * WIP: Port 3D LUT to BGFX * Finish porting LUT to BGFX * Add individual phosphor color conversion for HLSL new file: hlsl/chroma.fx Shader for converting xyY3 to sRGB modified: hlsl/phosphor.fx Minor changes to emphasize idea that phosphors are color agnostic modified: hlsl/post.fx Conversion from signal RGB to xyY3 modified: src/osd/modules/render/d3d/d3dhlsl.cpp modified: src/osd/modules/render/d3d/d3dhlsl.h modified: src/osd/windows/winmain.cpp modified: src/osd/windows/winmain.h * Add phosphor examples and update presets * Port phosphor color shaders to BGFX * Fix missing newlines at EOFbemani_k573msu_wip
parent
7b42e2f799
commit
b5a54b761c
61 changed files with 1026 additions and 172 deletions
@ -0,0 +1,36 @@ |
||||
{ |
||||
"name": "3D LUT", |
||||
"author": "W. M. Martinez", |
||||
"targets": [ |
||||
{ |
||||
"name": "temp", |
||||
"mode": "guest" |
||||
} |
||||
], |
||||
"passes": [ |
||||
{ |
||||
"effect": "misc/blit", |
||||
"name": "Copy To Filtered Texture", |
||||
"input": [ |
||||
{ "sampler": "s_tex", "texture": "screen" } |
||||
], |
||||
"output": "temp" |
||||
}, { |
||||
"effect": "misc/lut", |
||||
"name": "Apply LUT", |
||||
"input": [ |
||||
{ |
||||
"sampler": "s_tex", |
||||
"target": "temp" |
||||
}, { |
||||
"sampler": "s_3dlut", |
||||
"option": "bgfx_lut", |
||||
"bilinear": false, |
||||
"clamp": true, |
||||
"selection": "LUT Texture" |
||||
} |
||||
], |
||||
"output": "output" |
||||
} |
||||
] |
||||
} |
@ -0,0 +1,33 @@ |
||||
// license:BSD-3-Clause |
||||
// copyright-holders:W. M. Martinez |
||||
//============================================================ |
||||
// |
||||
// chroma.json: Phosphor chromaticity conversion |
||||
// |
||||
//============================================================ |
||||
{ |
||||
"blend": { |
||||
"equation": "add", |
||||
"srcColor": "srcalpha", |
||||
"dstColor": "1-srcalpha", |
||||
"srcAlpha": "srcalpha", |
||||
"dstAlpha": "1-srcalpha" |
||||
}, |
||||
"depth": { |
||||
"function": "always" |
||||
}, |
||||
"cull": { "mode": "none" }, |
||||
"write": { |
||||
"rgb": true, |
||||
"alpha": true |
||||
}, |
||||
"vertex": "chains/hlsl/vs_chroma", |
||||
"fragment": "chains/hlsl/fs_chroma", |
||||
"uniforms": [ |
||||
{ "name": "s_tex", "type": "int", "values": [ 0.0 ] }, |
||||
{ "name": "u_y_gain", "type": "vec4", "values": [ 0.2124, 0.7011, 0.0866, 0.0 ] }, |
||||
{ "name": "u_chroma_a", "type": "vec4", "values": [ 0.630, 0.340, 0.0, 0.0 ] }, |
||||
{ "name": "u_chroma_b", "type": "vec4", "values": [ 0.310, 0.595, 0.0, 0.0 ] }, |
||||
{ "name": "u_chroma_c", "type": "vec4", "values": [ 0.155, 0.070, 0.0, 0.0 ] } |
||||
] |
||||
} |
@ -0,0 +1,32 @@ |
||||
{ |
||||
"blend": { |
||||
"equation": "add", |
||||
"srcColor": "srcalpha", |
||||
"dstColor": "1-srcalpha", |
||||
"srcAlpha": "srcalpha", |
||||
"dstAlpha": "1-srcalpha" |
||||
}, |
||||
"depth": { |
||||
"function": "always" |
||||
}, |
||||
"cull": { |
||||
"mode": "none" |
||||
}, |
||||
"write": { |
||||
"rgb": true, |
||||
"alpha": true |
||||
}, |
||||
"vertex": "chains/misc/vs_lut", |
||||
"fragment": "chains/misc/fs_lut", |
||||
"uniforms": [ |
||||
{ |
||||
"name": "s_tex", |
||||
"type": "int", |
||||
"values": [ 1.0 ] |
||||
}, { |
||||
"name": "s_3dlut", |
||||
"type": "int", |
||||
"values": [ 1.0 ] |
||||
} |
||||
] |
||||
} |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,122 @@ |
||||
// license:BSD-3-Clause |
||||
// copyright-holders:W. M. Martinez |
||||
//----------------------------------------------------------------------------- |
||||
// Phosphor Chromaticity to sRGB Transform Effect |
||||
//----------------------------------------------------------------------------- |
||||
|
||||
//----------------------------------------------------------------------------- |
||||
// Sampler Definitions |
||||
//----------------------------------------------------------------------------- |
||||
|
||||
texture Diffuse; |
||||
|
||||
sampler DiffuseSampler = sampler_state |
||||
{ |
||||
Texture = <Diffuse>; |
||||
MipFilter = LINEAR; |
||||
MinFilter = LINEAR; |
||||
MagFilter = LINEAR; |
||||
AddressU = CLAMP; |
||||
AddressV = CLAMP; |
||||
AddressW = CLAMP; |
||||
}; |
||||
|
||||
//----------------------------------------------------------------------------- |
||||
// Vertex Definitions |
||||
//----------------------------------------------------------------------------- |
||||
|
||||
struct VS_OUTPUT |
||||
{ |
||||
float4 Position : POSITION; |
||||
float4 Color : COLOR0; |
||||
float2 TexCoord : TEXCOORD0; |
||||
float2 PrevCoord : TEXCOORD1; |
||||
}; |
||||
|
||||
struct VS_INPUT |
||||
{ |
||||
float3 Position : POSITION; |
||||
float4 Color : COLOR0; |
||||
float2 TexCoord : TEXCOORD0; |
||||
}; |
||||
|
||||
struct PS_INPUT |
||||
{ |
||||
float4 Color : COLOR0; |
||||
float2 TexCoord : TEXCOORD0; |
||||
float2 PrevCoord : TEXCOORD1; |
||||
}; |
||||
|
||||
//----------------------------------------------------------------------------- |
||||
// Chroma Vertex Shader |
||||
//----------------------------------------------------------------------------- |
||||
|
||||
uniform float2 ScreenDims; |
||||
uniform float2 TargetDims; |
||||
|
||||
uniform bool Passthrough; |
||||
|
||||
VS_OUTPUT vs_main(VS_INPUT Input) |
||||
{ |
||||
VS_OUTPUT Output = (VS_OUTPUT)0.0; |
||||
|
||||
Output.Position = float4(Input.Position.xyz, 1.0); |
||||
Output.Position.xy /= ScreenDims; |
||||
Output.Position.y = 1.0 - Output.Position.y; // flip y |
||||
Output.Position.xy -= 0.5; // center |
||||
Output.Position.xy *= 2.0; // zoom |
||||
|
||||
Output.TexCoord = Input.TexCoord; |
||||
Output.TexCoord += 0.5 / TargetDims; // half texel offset correction (DX9) |
||||
|
||||
Output.PrevCoord = Output.TexCoord; |
||||
|
||||
Output.Color = Input.Color; |
||||
|
||||
return Output; |
||||
} |
||||
|
||||
//----------------------------------------------------------------------------- |
||||
// Chroma Pixel Shader |
||||
//----------------------------------------------------------------------------- |
||||
|
||||
uniform float3 YGain = float3(0.2126, 0.7152, 0.0722); |
||||
uniform float2 ChromaA = float2(0.630, 0.340); |
||||
uniform float2 ChromaB = float2(0.310, 0.595); |
||||
uniform float2 ChromaC = float2(0.155, 0.070); |
||||
|
||||
static const float3x3 XYZ_TO_sRGB = { |
||||
3.2406, -1.5372, -0.4986, |
||||
-0.9689, 1.8758, 0.0415, |
||||
0.0557, -0.2040, 1.0570 |
||||
}; |
||||
|
||||
float4 ps_main(PS_INPUT Input) : COLOR |
||||
{ |
||||
const float4 cin = tex2D(DiffuseSampler, Input.TexCoord); |
||||
float4 cout = float4(0.0, 0.0, 0.0, cin.a); |
||||
const float3x2 xy = { ChromaA, ChromaB, ChromaC }; |
||||
|
||||
for (int i = 0; i < 3; ++i) { |
||||
const float Y = YGain[i] * cin[i]; |
||||
const float X = xy[i].x * (Y / xy[i].y); |
||||
const float Z = (1.0 - xy[i].x - xy[i].y) * (Y / xy[i].y); |
||||
cout.rgb += mul(XYZ_TO_sRGB, float3(X, Y, Z)); |
||||
} |
||||
return cout; |
||||
} |
||||
|
||||
//----------------------------------------------------------------------------- |
||||
// Phosphor Technique |
||||
//----------------------------------------------------------------------------- |
||||
|
||||
technique DefaultTechnique |
||||
{ |
||||
pass Pass0 |
||||
{ |
||||
Lighting = FALSE; |
||||
|
||||
VertexShader = compile vs_2_0 vs_main(); |
||||
PixelShader = compile ps_2_0 ps_main(); |
||||
} |
||||
} |
@ -0,0 +1,21 @@ |
||||
# Example for BT.601 525-line Color Space |
||||
# |
||||
# BT.601 is a standard for converting analog video into the digital domain, |
||||
# and serves as a reference for the color space of analog video, but the color |
||||
# spaces defined existed before the standard. |
||||
# |
||||
# Due to historical differences, there are two color spaces in BT.601: one for |
||||
# 525-line television (developed in the U.S.), and one for 625-line television |
||||
# (developed in Europe). The color spaces, along with NTSC-J, converged upon |
||||
# the development of HD television with the BT.709 standard. |
||||
# |
||||
# This color space should be used for most 60 Hz arcade systems, consoles, and |
||||
# computer systems. |
||||
# |
||||
# DIRECT3D POST-PROCESSING OPTIONS |
||||
# |
||||
chroma_mode 3 |
||||
chroma_a 0.630,0.340 |
||||
chroma_b 0.310,0.595 |
||||
chroma_c 0.155,0.070 |
||||
chroma_y_gain 0.2124,0.7011,0.0866 |
@ -0,0 +1,21 @@ |
||||
# Example for BT.601 625-line Color Space |
||||
# |
||||
# BT.601 is a standard for converting analog video into the digital domain, |
||||
# and serves as a reference for the color space of analog video, but the color |
||||
# spaces defined existed before the standard. |
||||
# |
||||
# Due to historical differences, there are two color spaces in BT.601: one for |
||||
# 525-line television (developed in the U.S.), and one for 625-line television |
||||
# (developed in Europe). The color spaces, along with NTSC-J, converged upon |
||||
# the development of HD television with the BT.709 standard. |
||||
# |
||||
# This color space should be used for most 50 Hz arcade systems, consoles, and |
||||
# computer systems. |
||||
# |
||||
# DIRECT3D POST-PROCESSING OPTIONS |
||||
# |
||||
chroma_mode 3 |
||||
chroma_a 0.64,0.33 |
||||
chroma_b 0.29,0.60 |
||||
chroma_c 0.15,0.06 |
||||
chroma_y_gain 0.2220,0.7067,0.0713 |
@ -0,0 +1,16 @@ |
||||
# Example for NTSC-J Color Space |
||||
# |
||||
# NTSC-J has identical colorimetry to the BT.601 525-line standard, but uses a |
||||
# 9300K white-point 'D93'. Note that this white point is not necessarily |
||||
# definitive for all Japanese works. |
||||
# |
||||
# This color space may be used for 60 Hz arcade systems and consoles as an |
||||
# alternative to BT.601 525-line. |
||||
# |
||||
# DIRECT3D POST-PROCESSING OPTIONS |
||||
# |
||||
chroma_mode 3 |
||||
chroma_a 0.630,0.340 |
||||
chroma_b 0.310,0.595 |
||||
chroma_c 0.155,0.070 |
||||
chroma_gain 0.1875,0.6940,0.1185 |
@ -0,0 +1,12 @@ |
||||
# P1 Phosphor |
||||
# |
||||
# Multipurpose green phosphor |
||||
# |
||||
# Perhaps the most well-known phosphor, it has medium persistence. |
||||
# |
||||
# DIRECT3D POST-PROCESSING OPTIONS |
||||
# |
||||
chroma_mode 1 |
||||
chroma_a 0.218,0.712 |
||||
chroma_conversion_gain 0.30,0.59,0.11 |
||||
chroma_y_gain 1.0,0.0,0.0 |
@ -0,0 +1,15 @@ |
||||
# P14 Phosphor |
||||
# |
||||
# Dual-color phosphor for military RADAR |
||||
# |
||||
# Red channel should be set to medium-short persistence. Green |
||||
# channel should be set to medium. |
||||
# |
||||
# DIRECT3D POST-PROCESSING OPTIONS |
||||
# |
||||
phosphor_life 0.2,0.6,0.0 |
||||
chroma_mode 1 |
||||
chroma_a 0.150,0.093 |
||||
chroma_b 0.504,0.443 |
||||
chroma_conversion_gain 0.30,0.59,0.11 |
||||
chroma_y_gain 0.50,0.50,0.0 |
@ -0,0 +1,12 @@ |
||||
# P2 Phosphor |
||||
# |
||||
# Green phosphor for oscilloscopes |
||||
# |
||||
# This phosphor was developed as a fast response alternative to P1. |
||||
# |
||||
# DIRECT3D POST-PROCESSING OPTIONS |
||||
# |
||||
chroma_mode 1 |
||||
chroma_a 0.279,0.534 |
||||
chroma_conversion_gain 0.30,0.59,0.11 |
||||
chroma_y_gain 1.0,0.0,0.0 |
@ -0,0 +1,12 @@ |
||||
# P3 Phosphor |
||||
# |
||||
# Amber phosphor for monochrome monitors |
||||
# |
||||
# Medium persistence |
||||
# |
||||
# DIRECT3D POST-PROCESSING OPTIONS< |