Buffer Buffer4F : register(t0); Buffer Buffer4I : register(t0); Buffer Buffer4UI : register(t0); struct VS_OUTPUT { float4 position : SV_Position; uint index : TEXCOORD0; uint slice : LAYER; }; struct GS_OUTPUT { float4 position : SV_Position; uint index : TEXCOORD0; uint slice : SV_RenderTargetArrayIndex; }; cbuffer BufferCopyParams : register(b0) { uint FirstPixelOffset; uint PixelsPerRow; uint RowStride; uint RowsPerSlice; float2 PositionOffset; float2 PositionScale; int2 TexLocationOffset; int2 TexLocationScale; } void ComputePositionAndIndex(uint vertexID, out VS_OUTPUT outVertex) { uint PixelsPerSlice = PixelsPerRow * RowsPerSlice; uint SliceStride = RowStride * RowsPerSlice; uint slice = vertexID / PixelsPerSlice; uint sliceOffset = slice * PixelsPerSlice; uint row = (vertexID - sliceOffset) / PixelsPerRow; uint col = vertexID - sliceOffset - (row * PixelsPerRow); float2 coords = float2(float(col), float(row)); outVertex.position = float4(PositionOffset + PositionScale * coords, 0.0f, 1.0f); outVertex.index = FirstPixelOffset + slice * SliceStride + row * RowStride + col; outVertex.slice = slice; } void VS_BufferToTexture(in uint vertexID : SV_VertexID, out VS_OUTPUT outVertex) { ComputePositionAndIndex(vertexID, outVertex); } [maxvertexcount(1)] void GS_BufferToTexture(point VS_OUTPUT inVertex[1], inout PointStream outStream) { GS_OUTPUT outVertex; outVertex.position = inVertex[0].position; outVertex.index = inVertex[0].index; outVertex.slice = inVertex[0].slice; outStream.Append(outVertex); } float4 PS_BufferToTexture_4F(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target { return Buffer4F.Load(inIndex); } int4 PS_BufferToTexture_4I(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target { return Buffer4I.Load(inIndex); } uint4 PS_BufferToTexture_4UI(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target { return Buffer4UI.Load(inIndex); }