Files
UnrealEngine/Engine/Plugins/Media/NDIMedia/Shaders/Private/NDIMediaShaders.usf
2025-05-18 13:04:45 +08:00

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);
}