예제 #1
0
        private string GetShaderHeader(FilterLoader.Type kernel, IShaderBuilder builder)
        {
            string filterDirectionVar = parent.IsSepa ? "int3 filterDirection;" : "";

            return($@"
{builder.UavType}  dst_image : register(u0);
{builder.SrvSingleType} src_image : register(t0);
{builder.SrvType} src_image_ex : register(t1);

SamplerState linearSampler : register(s0);
SamplerState pointSampler : register(s1);

cbuffer LayerLevelBuffer : register(b0) {{
    uint layer;
    uint level;
    uint2 LayerLevelBuffer_padding_;
    {filterDirectionVar}
}};

// texel helper function
#if {builder.Is3DInt}
int3 texel(int3 coord) {{ return coord; }}
int3 texel(int3 coord, int layer) {{ return coord; }}
#else
int2 texel(int3 coord) {{ return coord.xy; }}
int3 texel(int3 coord, int layer) {{ return int3(coord.xy, layer); }}
#endif

float4 filter{GetKernelDeclaration(kernel)};

[numthreads({localSize}, {localSize}, {(builder.Is3D?localSize:1)})]
void main(uint3 coord : SV_DISPATCHTHREADID) {{
    
    uint width, height, depth;
    dst_image.GetDimensions(width, height, depth);
    uint3 dstCoord = coord;
    uint3 size = int3(width, height, depth);
    if(coord.x >= width || coord.y >= height) return;
#if {builder.Is3DInt}
    if(coord.z >= depth) return;
#else
    dstCoord.z = layer;
    size.z = 1;
#endif

#if {(kernel == FilterLoader.Type.Tex2D?1:0)}
     dst_image[dstCoord] = filter(coord.xy, size.xy);
#elif {(kernel == FilterLoader.Type.Color ? 1 : 0)}
    dst_image[dstCoord] = filter(src_image[texel(coord)]);
#else // dynamic or 3D
    dst_image[dstCoord] = filter(coord, size);
#endif
}}
" + GetParamBufferDescription(parent.Parameters) + GetTextureParamBindings(parent.TextureParameters, builder));
        }
예제 #2
0
 public FilterShader(FilterModel parent, string source, int groupSize, FilterLoader.Type kernel, IShaderBuilder builder)
 {
     localSize   = groupSize;
     this.parent = parent;
     is3D        = builder.Is3D;
     shader      = new DirectX.Shader(DirectX.Shader.Type.Compute, GetShaderHeader(kernel, builder) + "\n#line 1\n" + source, parent.Filename);
     if (parent.Parameters.Count != 0)
     {
         paramBuffer = new UploadBuffer(4 * parent.Parameters.Count);
         UpdateParamBuffer();
     }
 }
예제 #3
0
        private static string GetKernelDeclaration(FilterLoader.Type kernel)
        {
            switch (kernel)
            {
            case FilterLoader.Type.Tex2D:
                return("(int2 pixel, int2 size)");

            case FilterLoader.Type.Dynamic:
            case FilterLoader.Type.Tex3D:
                return("(int3 pixel, int3 size)");

            case FilterLoader.Type.Color:
                return("(float4 color)");
            }

            return("");
        }