Improve colors for nv12
This commit is contained in:
@@ -10,6 +10,8 @@ cbuffer ColorMatrix : register(b0) {
|
|||||||
float4 color_vec_y;
|
float4 color_vec_y;
|
||||||
float4 color_vec_u;
|
float4 color_vec_u;
|
||||||
float4 color_vec_v;
|
float4 color_vec_v;
|
||||||
|
float2 range_y;
|
||||||
|
float2 range_uv;
|
||||||
};
|
};
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
@@ -24,5 +26,8 @@ float2 main_ps(FragTexWide input) : SV_Target
|
|||||||
float u = dot(color_vec_u.xyz, rgb) + color_vec_u.w;
|
float u = dot(color_vec_u.xyz, rgb) + color_vec_u.w;
|
||||||
float v = dot(color_vec_v.xyz, rgb) + color_vec_v.w;
|
float v = dot(color_vec_v.xyz, rgb) + color_vec_v.w;
|
||||||
|
|
||||||
return float2(u, v);
|
u = u * range_uv.x + range_uv.y;
|
||||||
|
v = v * range_uv.x + range_uv.y;
|
||||||
|
|
||||||
|
return float2(u, v * 224.0f/256.0f + 0.0625);
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,8 @@ cbuffer ColorMatrix : register(b0) {
|
|||||||
float4 color_vec_y;
|
float4 color_vec_y;
|
||||||
float4 color_vec_u;
|
float4 color_vec_u;
|
||||||
float4 color_vec_v;
|
float4 color_vec_v;
|
||||||
|
float2 range_y;
|
||||||
|
float2 range_uv;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PS_INPUT
|
struct PS_INPUT
|
||||||
@@ -17,7 +19,7 @@ struct PS_INPUT
|
|||||||
float main_ps(PS_INPUT frag_in) : SV_Target
|
float main_ps(PS_INPUT frag_in) : SV_Target
|
||||||
{
|
{
|
||||||
float3 rgb = image.Sample(def_sampler, frag_in.tex, 0).rgb;
|
float3 rgb = image.Sample(def_sampler, frag_in.tex, 0).rgb;
|
||||||
float y = dot(color_vec_y.xyz, rgb) + color_vec_y.w;
|
float y = dot(color_vec_y.xyz, rgb);
|
||||||
|
|
||||||
return y;
|
return y * range_y.x + range_y.y;
|
||||||
}
|
}
|
||||||
@@ -26,30 +26,42 @@ using blob_t = util::safe_ptr<ID3DBlob, Release<ID3DBlob>>;
|
|||||||
using depth_stencil_state_t = util::safe_ptr<ID3D11DepthStencilState, Release<ID3D11DepthStencilState>>;
|
using depth_stencil_state_t = util::safe_ptr<ID3D11DepthStencilState, Release<ID3D11DepthStencilState>>;
|
||||||
using depth_stencil_view_t = util::safe_ptr<ID3D11DepthStencilView, Release<ID3D11DepthStencilView>>;
|
using depth_stencil_view_t = util::safe_ptr<ID3D11DepthStencilView, Release<ID3D11DepthStencilView>>;
|
||||||
|
|
||||||
|
using float4 = DirectX::XMFLOAT4;
|
||||||
|
using float3 = DirectX::XMFLOAT3;
|
||||||
|
using float2 = DirectX::XMFLOAT2;
|
||||||
struct __attribute__ ((__aligned__ (16))) color_t {
|
struct __attribute__ ((__aligned__ (16))) color_t {
|
||||||
DirectX::XMFLOAT4 color_vec_y;
|
float4 color_vec_y;
|
||||||
DirectX::XMFLOAT4 color_vec_u;
|
float4 color_vec_u;
|
||||||
DirectX::XMFLOAT4 color_vec_v;
|
float4 color_vec_v;
|
||||||
|
float2 range_y;
|
||||||
|
float2 range_uv;
|
||||||
};
|
};
|
||||||
|
|
||||||
color_t make_color_matrix(float Cr, float Cb, float U_max, float V_max, float add_Y, float add_UV) {
|
color_t make_color_matrix(float Cr, float Cb, float U_max, float V_max, float add_Y, float add_UV, float2 range_Y, float2 range_UV) {
|
||||||
float Cg = 1.0f - Cr - Cb;
|
float Cg = 1.0f - Cr - Cb;
|
||||||
|
|
||||||
float Cr_i = 1.0f - Cr;
|
float Cr_i = 1.0f - Cr;
|
||||||
float Cb_i = 1.0f - Cb;
|
float Cb_i = 1.0f - Cb;
|
||||||
|
|
||||||
|
float shift_y = range_Y.x / 256.0f;
|
||||||
|
float shift_uv = range_UV.x / 256.0f;
|
||||||
|
|
||||||
|
float scale_y = (range_Y.y - range_Y.x) / 256.0f;
|
||||||
|
float scale_uv = (range_UV.y - range_UV.x) / 256.0f;
|
||||||
return {
|
return {
|
||||||
{ Cr, Cg, Cb, add_Y },
|
{ Cr, Cg, Cb, add_Y },
|
||||||
{ -(Cr * U_max / Cb_i), -(Cg * U_max / Cb_i), U_max, add_UV },
|
{ -(Cr * U_max / Cb_i), -(Cg * U_max / Cb_i), U_max, add_UV },
|
||||||
{ V_max, -(Cg * V_max / Cr_i), -(Cb * V_max / Cr_i), add_UV }
|
{ V_max, -(Cg * V_max / Cr_i), -(Cb * V_max / Cr_i), add_UV },
|
||||||
|
{ scale_y, shift_y },
|
||||||
|
{ scale_uv, shift_uv },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
color_t colors[] {
|
color_t colors[] {
|
||||||
make_color_matrix(0.299f, 0.114f, 0.436f, 0.615f, 0.0625, 0.5f), // BT601 MPEG
|
make_color_matrix(0.299f, 0.114f, 0.436f, 0.615f, 0.0625, 0.5f, { 16.0f, 235.0f }, { 16.0f, 240.0f }), // BT601 MPEG
|
||||||
make_color_matrix(0.299f, 0.114f, 0.5f, 0.5f, 0.0f, 0.5f), // BT601 JPEG
|
make_color_matrix(0.299f, 0.114f, 0.5f, 0.5f, 0.0f, 0.5f, { 0.0f, 255.0f }, { 0.0f, 255.0f }), // BT601 JPEG
|
||||||
make_color_matrix(0.2126f, 0.0722f, 0.436f, 0.615f, 0.0625, 0.5f), //BT701 MPEG
|
make_color_matrix(0.2126f, 0.0722f, 0.436f, 0.615f, 0.0625, 0.5f, { 16.0f, 235.0f }, { 16.0f, 240.0f }), //BT701 MPEG
|
||||||
make_color_matrix(0.2126f, 0.0722f, 0.5f, 0.5f, 0.0f, 0.5f), //BT701 JPEG
|
make_color_matrix(0.2126f, 0.0722f, 0.5f, 0.5f, 0.0f, 0.5f, { 0.0f, 255.0f }, { 0.0f, 255.0f }), //BT701 JPEG
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
@@ -847,6 +859,15 @@ std::shared_ptr<platf::hwdevice_t> display_vram_t::make_hwdevice(int width, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
int init() {
|
int init() {
|
||||||
|
for(auto &color : colors) {
|
||||||
|
BOOST_LOG(debug) << "Color Matrix"sv;
|
||||||
|
BOOST_LOG(debug) << "Y ["sv << color.color_vec_y.x << ", "sv << color.color_vec_y.y << ", "sv << color.color_vec_y.z << ", "sv << color.color_vec_y.w << ']';
|
||||||
|
BOOST_LOG(debug) << "U ["sv << color.color_vec_u.x << ", "sv << color.color_vec_u.y << ", "sv << color.color_vec_u.z << ", "sv << color.color_vec_u.w << ']';
|
||||||
|
BOOST_LOG(debug) << "V ["sv << color.color_vec_v.x << ", "sv << color.color_vec_v.y << ", "sv << color.color_vec_v.z << ", "sv << color.color_vec_v.w << ']';
|
||||||
|
BOOST_LOG(debug) << "range Y ["sv << color.range_y.x << ", "sv << color.range_y.y << ']';
|
||||||
|
BOOST_LOG(debug) << "range UV ["sv << color.range_uv.x << ", "sv << color.range_uv.y << ']';
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_LOG(info) << "Compiling shaders..."sv;
|
BOOST_LOG(info) << "Compiling shaders..."sv;
|
||||||
merge_Y_vs_hlsl = compile_vertex_shader(SUNSHINE_ASSETS_DIR "/MergeYVS.hlsl");
|
merge_Y_vs_hlsl = compile_vertex_shader(SUNSHINE_ASSETS_DIR "/MergeYVS.hlsl");
|
||||||
if(!merge_Y_vs_hlsl) {
|
if(!merge_Y_vs_hlsl) {
|
||||||
|
|||||||
Reference in New Issue
Block a user