Files
ZHGD_Web/Assets/Art/Art Plugins/GPUInstancer/Resources/Compute/CSTextureUtils.compute
2025-07-13 23:16:20 +08:00

77 lines
2.2 KiB
Plaintext

#include "Include/PlatformDefines.hlsl"
#pragma kernel CSCopyTexture
#pragma kernel CSReduceTexture
#pragma kernel CSCopyTextureArray
uniform Texture2D<float4> source;
uniform SamplerState sampler_source;
uniform Texture2DArray<float4> textureArray;
uniform SamplerState sampler_textureArray;
uniform RWTexture2D<float4> destination;
uniform uint offsetX;
uniform uint sourceSizeX;
uniform uint sourceSizeY;
uniform uint destinationSizeX;
uniform uint destinationSizeY;
uniform bool reverseZ;
uniform uint textureArrayIndex;
[numthreads(GPUI_THREADS_2D, GPUI_THREADS_2D, 1)]
void CSCopyTexture(uint3 id : SV_DispatchThreadID)
{
if (id.x >= sourceSizeX || id.y >= sourceSizeY)
return;
uint indexX = id.x + offsetX;
float4 color = source[id.xy];
#if SHADER_API_GLCORE || SHADER_API_GLES3
if (reverseZ)
color.r = 1 - color.r;
#endif
destination[uint2(indexX, id.y)] = color;
}
[numthreads(GPUI_THREADS_2D, GPUI_THREADS_2D, 1)]
void CSReduceTexture(uint3 id : SV_DispatchThreadID)
{
uint indexX = id.x + offsetX;
if (indexX >= destinationSizeX || id.y >= destinationSizeY)
return;
float2 uv = float2((id.x + 0.5) / destinationSizeX, (id.y + 0.5) / destinationSizeY);
float4 r;
r.x = source.SampleLevel(sampler_source, uv + float2(1.0 / sourceSizeX, 0), 0).r;
r.y = source.SampleLevel(sampler_source, uv + float2(-1.0 / sourceSizeX, 0), 0).r;
r.z = source.SampleLevel(sampler_source, uv + float2(0, 1.0 / sourceSizeY), 0).r;
r.w = source.SampleLevel(sampler_source, uv + float2(0, -1.0 / sourceSizeY), 0).r;
float minimum = min(min(min(r.x, r.y), r.z), r.w);
destination[uint2(indexX, id.y)] = float4(minimum, 1.0, 1.0, 1.0);
}
[numthreads(GPUI_THREADS_2D, GPUI_THREADS_2D, 1)]
void CSCopyTextureArray(uint3 id : SV_DispatchThreadID)
{
if (id.x >= sourceSizeX || id.y >= sourceSizeY)
return;
uint indexX = id.x + offsetX;
float4 color = textureArray.SampleLevel(sampler_textureArray, float3(id.x / float(sourceSizeX), id.y / float(sourceSizeY), textureArrayIndex), 0);
#if SHADER_API_GLCORE || SHADER_API_GLES3
if (reverseZ)
color.r = 1 - color.r;
#endif
destination[uint2(indexX, id.y)] = color;
}