Hello!
Direct3D 11 added several new resource types for shaders. The ones of interest for this post is Buffer, StructuredBuffer and ByteAddressBuffer. I have some questions about the differences between them. I have mostly used StructuredBuffer before and occasionally Buffer. I have never used ByteAddressBuffer. I mostly care about Buffer and StructuredBuffer but figured I'd include ByteAddressBuffer aswell.
I know that with a regular Buffer the data in the buffer can have a different format than what you declare it with in the shader and the GPU will automatically do the conversion just like when you sample a texture or pass in data in a vertex buffer. With a StructuredBuffer the data has to match the declaration in the shader which limits you to HLSL types.
Other than that and the syntax difference is there any other difference between Buffer and StructuredBuffer? Any difference in performance? If my data isn't stored in a different format than how I use it in the shader is there any reason to use Buffer over StructuredBuffer?
For example is there any difference between these two (assuming that the data in the buffer are regular uncompressed floats)?
struct SData
{
float f;
};
StructuredBuffer< SData > Buf;
Buffer< float > Buf;
Another example, would it make any difference for performance or anything else between these two?
struct SData
{
float f;
uint i;
};
StructuredBuffer< SData > Buf;
Buffer< float > Buf1;
Buffer< uint > Buf2;
And finally, what's the reason to use a ByteAddressBuffer? Like I said I've never used them so I just know what the documentation says. You can't access individual bytes, you have to access whole uint values. So why use a ByteAddressBuffer over something like:
Buffer< uint > Buf;
Thanks for helping me clear this up.