77 lines
2.2 KiB
Plaintext
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;
|
|
|
|
} |