#pragma kernel CSMain RWTexture2D Result; float Width; float Height; bool TakeRGBFromRTexture; //Config: has texture, billinearFiltering / fallback, channel, invert Texture2D R_Input; float4 R_Config; Texture2D G_Input; float4 G_Config; Texture2D B_Input; float4 B_Config; Texture2D A_Input; float4 A_Config; SamplerState linearClampSampler; SamplerState pointClampSampler; float SampleInput(Texture2D tex, float4 config, float2 uv) { if (config.r == 0) { return config.g; } float value = 0; float4 pixelColor = float4(1,1,1,1); if(config.g == 0) pixelColor = tex.SampleLevel(pointClampSampler, uv, 0); else pixelColor = pixelColor = tex.SampleLevel(linearClampSampler, uv, 0); if (config.b == 0) value = pixelColor.r; else if (config.b == 1) value = pixelColor.g; else if (config.b == 2) value = pixelColor.b; else if (config.b == 3) value = pixelColor.a; else value = max(pixelColor.r, max(pixelColor.g, pixelColor.b)); if (config.a == 1) value = 1 - value; return value; } float3 SampleInputRGB(Texture2D tex, float4 config, float2 uv) { if (config.r == 0) { return float3(config.g, config.g, config.g); } float4 pixelColor = float4(1, 1, 1, 1); if (config.g == 0) pixelColor = tex.SampleLevel(pointClampSampler, uv, 0); else pixelColor = pixelColor = tex.SampleLevel(linearClampSampler, uv, 0); if (config.a == 1) { pixelColor.r = 1 - pixelColor.r; pixelColor.g = 1 - pixelColor.g; pixelColor.b = 1 - pixelColor.b; } return pixelColor; } [numthreads(8, 8, 1)] void CSMain(uint3 id : SV_DispatchThreadID) { float2 uv = float2(id.x / Width, id.y / Height); float4 pixel = float4(1, 1, 1, 1); if (TakeRGBFromRTexture) { pixel.rgb = SampleInputRGB(R_Input, R_Config, uv); pixel.a = SampleInput(G_Input, G_Config, uv); } else { pixel.r = SampleInput(R_Input, R_Config, uv); pixel.g = SampleInput(G_Input, G_Config, uv); pixel.b = SampleInput(B_Input, B_Config, uv); pixel.a = SampleInput(A_Input, A_Config, uv); } Result[id.xy] = pixel; }