96 lines
3.2 KiB
HLSL
96 lines
3.2 KiB
HLSL
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "/Engine/Public/Platform.ush"
|
|
#include "/Engine/Generated/GeneratedUniformBuffers.ush"
|
|
#include "/Engine/Private/GammaCorrectionCommon.ush"
|
|
#include "/Engine/Private/TonemapCommon.ush"
|
|
|
|
// ----------------- Begin Duplicated from MediaShaders.usf -------------------------
|
|
// todo: could be extracted in a MediaShadersCommon.ush.
|
|
|
|
#define UE_Color_EEncoding_Linear 1u
|
|
#define UE_Color_EEncoding_sRGB 2u
|
|
#define UE_Color_EEncoding_ST2084 3u
|
|
#define UE_Color_EEncoding_Gamma22 4u
|
|
#define UE_Color_EEncoding_BT1886 5u
|
|
#define UE_Color_EEncoding_Gamma26 6u
|
|
#define UE_Color_EEncoding_Cineon 7u
|
|
#define UE_Color_EEncoding_REDLog 8u
|
|
#define UE_Color_EEncoding_REDLog3G10 9u
|
|
#define UE_Color_EEncoding_SLog1 10u
|
|
#define UE_Color_EEncoding_SLog2 11u
|
|
#define UE_Color_EEncoding_SLog3 12u
|
|
#define UE_Color_EEncoding_AlexaV3LogC 13u
|
|
#define UE_Color_EEncoding_CanonLog 14u
|
|
#define UE_Color_EEncoding_ProTune 15u
|
|
#define UE_Color_EEncoding_VLog 16u
|
|
|
|
#define ToneMapMethod_None 0u
|
|
#define ToneMapMethod_Hable 1u
|
|
#define ToneMapMethod_SimpleReinhard 2u
|
|
|
|
float3 ApplyColorProcessingRGB(float3 Color, float4x4 CSMtx, uint EOTF, uint ToneMapMethod = 0)
|
|
{
|
|
// Go linear
|
|
switch(EOTF)
|
|
{
|
|
case UE_Color_EEncoding_sRGB: Color = sRGBToLinear(Color); break;
|
|
case UE_Color_EEncoding_ST2084: Color = ST2084ToLinear(Color); break;
|
|
case UE_Color_EEncoding_SLog3: Color = SLog3ToLinear(Color); break;
|
|
default: break;
|
|
}
|
|
|
|
// Adjust colorspace
|
|
float4 Col4 = float4(Color, 1);
|
|
Color.x = dot(CSMtx[0], Col4);
|
|
Color.y = dot(CSMtx[1], Col4);
|
|
Color.z = dot(CSMtx[2], Col4);
|
|
|
|
switch(ToneMapMethod)
|
|
{
|
|
case ToneMapMethod_Hable: Color = HableToneMap(Color); break;
|
|
case ToneMapMethod_SimpleReinhard: Color = SimpleReinhardToneMap(Color); break;
|
|
default: break;
|
|
}
|
|
|
|
return Color;
|
|
}
|
|
|
|
float3 ApplyColorProcessing(float3 YUV, float4x4 YUVMtx, float4x4 CSMtx, uint EOTF, uint ToneMapMethod = 0)
|
|
{
|
|
float3 Color;
|
|
float4 YUV4 = float4(YUV, 1);
|
|
Color.x = dot(YUVMtx[0], YUV4);
|
|
Color.y = dot(YUVMtx[1], YUV4);
|
|
Color.z = dot(YUVMtx[2], YUV4);
|
|
|
|
// Make sure we safely stay above zero
|
|
Color = max(Color, 0.0f);
|
|
|
|
return ApplyColorProcessingRGB(Color, CSMtx, EOTF, ToneMapMethod);
|
|
}
|
|
|
|
// ----------------- End Duplicated from MediaShaders.usf -------------------------
|
|
|
|
// Conversion of UYVY-A format to RGBA.
|
|
// Input has 2 textures:
|
|
// - YUVTexture: UYVY 4:2:2
|
|
// - AlphaTexture: A8
|
|
void NDIMediaUYVYAConvertPS(
|
|
float4 InPosition : SV_POSITION,
|
|
float2 InUV : TEXCOORD0,
|
|
out float4 OutColor : SV_Target0)
|
|
{
|
|
float4 UYVYB = NDIMediaUYVYAConvertUB.YUVTexture.Sample(NDIMediaUYVYAConvertUB.SamplerB, InUV);
|
|
float4 UYVYT = NDIMediaUYVYAConvertUB.YUVTexture.Sample(NDIMediaUYVYAConvertUB.SamplerT, InUV);
|
|
float Alpha = NDIMediaUYVYAConvertUB.AlphaTexture.Sample(NDIMediaUYVYAConvertUB.SamplerT, InUV).w;
|
|
|
|
float PosX = 2.0f * InUV.x * NDIMediaUYVYAConvertUB.InputWidth;
|
|
|
|
float FracX = PosX % 2.0f;
|
|
float3 YUV;
|
|
YUV.x = (1 - FracX) * UYVYT.y + FracX * UYVYT.w;
|
|
YUV.yz = UYVYB.zx;
|
|
|
|
OutColor = float4(ApplyColorProcessing(YUV, NDIMediaUYVYAConvertUB.ColorTransform, NDIMediaUYVYAConvertUB.CSTransform, NDIMediaUYVYAConvertUB.EOTF, NDIMediaUYVYAConvertUB.ToneMapMethod), Alpha);
|
|
} |