Files
SimUL/Assets/UMA/InternalDataStore/InGame/Resources/Shader/Combiner.compute
T
2025-01-07 18:54:46 +02:00

154 lines
3.1 KiB
Plaintext

#pragma kernel Combiner
Texture2D<float4> InputR;
Texture2D<float4> InputG;
Texture2D<float4> InputB;
Texture2D<float4> InputA;
RWTexture2D<float4> Result;
SamplerState UMALinearClampSampler;
SamplerState samplerInputR;
SamplerState samplerInputG;
SamplerState samplerInputB;
SamplerState samplerInputA;
// texture sources
// 0 = r
// 1 = g
// 2 = b
// 3 = a
// 4 = pixel luminance
// 5 = pixel average
// 6 = color
int rSource;
int gSource;
int bSource;
int aSource;
int invertR;
int invertG;
int invertB;
int invertA;
float ColorR;
float ColorG;
float ColorB;
float ColorA;
int alphaOnly;
float GetColor(int colorsrc, float2 uv, float color, Texture2D tex, SamplerState myState)
{
if (colorsrc == 6)
return color;
float4 col = tex.SampleLevel(myState, uv, 0);
if (colorsrc == 4)
{
float luma = (col.r * 0.2126) + (col.g * 0.7152) + (col.b * 0.0722);
return clamp(luma,0.0f,1.0f);
}
if (colorsrc == 5)
{
return clamp((col.r+col.g+col.b)/3.0f,0.0f,1.0f);
}
return col[colorsrc];
}
[numthreads(1, 1, 1)]
void Combiner(uint3 id : SV_DispatchThreadID)
{
float2 src = float2(id.x, id.y);
float W,H;
float2 UV;
Result.GetDimensions(W,H);
UV = float2((id.x+0.5f)/W, (id.y+0.5f)/H);
float4 outColor;
if (alphaOnly == 1)
{
// Alpha only output
float a = GetColor(aSource,UV,ColorA,InputA,samplerInputA);
if (invertA)
{
a = 1.0f-a;
}
outColor.r = a;
outColor.g = a;
outColor.b = a;
outColor.a = 1.0f;
}
else if (alphaOnly==2)
{
// Red only output
float r = GetColor(rSource,UV,ColorR,InputR,samplerInputR);
if (invertR)
{
r = 1.0f - r;
}
outColor.r = r;
outColor.g = r;
outColor.b = r;
outColor.a = 1.0f;
}
else if (alphaOnly==3)
{
// Green only output
float g = GetColor(gSource,UV,ColorG,InputG,samplerInputG);
if(invertG)
{
g = 1.0f - g;
}
outColor.r = g;
outColor.g = g;
outColor.b = g;
outColor.a = 1.0f;
}
else if (alphaOnly==4)
{
// Blue only output
float b = GetColor(bSource,UV,ColorB,InputB,samplerInputB);
if (invertB)
{
b = 1.0f - b;
}
outColor.r = b;
outColor.g = b;
outColor.b = b;
outColor.a = 1.0f;
}
else
{
outColor.r = GetColor(rSource,UV,ColorR,InputR,samplerInputR);
outColor.g = GetColor(gSource,UV,ColorG,InputG,samplerInputG);
outColor.b = GetColor(bSource,UV,ColorB,InputB,samplerInputB);
outColor.a = GetColor(aSource,UV,ColorA,InputA,samplerInputA);
if (invertR>0)
{
outColor.r = 1.0f - outColor.r;
}
if (invertG>0)
{
outColor.g = 1.0f - outColor.g;
}
if (invertB>0)
{
outColor.b = 1.0f - outColor.b;
}
if (invertA>0)
{
outColor.a = 1.0f - outColor.a;
}
}
Result[id.xy] = outColor;
}