2. 访问资源
访问资源有几种方法。无论如何,Direct3D保证对超出范围访问的任何资源返回零。
- 2.1 通过字节偏移量访问
- 2.2 通过索引访问
- 2.3 通过Mips方法访问
- 相关主题
2.1 通过字节偏移量访问
可以使用字节偏移访问两个新的缓冲区类型:
- ByteAddressBuffer是只读缓冲区。
- RWByteAddressBuffer是读或写缓冲区。
2.2 通过索引访问
资源类型可以使用索引来引用资源中的特定位置。考虑以下这个例子:
uint2 pos;
Texture2D<float4> myTexture;
float4 myVar = myTexture[pos];
这个示例将4个浮点值赋给myVar变量。这些浮点值被存储在位于myTexture 2D纹理资源的pos位置的纹素(Texel/纹理上的像素点) 上。
注释
- 以这种方式访问纹理的默认值是纹理映射(mipmap/贴图/率纹理/纹理映射)级别0 (最详细的级别)。
- 这个“float4 myVar = myTexture[pos];”行相当于“float4 myVar = myTexture.Load(uint3(pos,0));”。通过索引访问是一种新的HLSL语法增强。
- 在2010年6月及以后版的DirectX SDK的编译器中, 允许您索引除字节地址缓冲区之外的所有资源类型。
- 2010年6月及以后的编译器允许声明本地资源变量。您可以将全局定义的资源(比如myTexture)分配给这些变量,并与全球同行一样使用它们。
2.3 通过Mips方法访问
纹理对象有一个mips方法(例如,Texture2D.mips),您可以使用它来指定纹理映射级别。这个示例读取存储在(7,16)纹理映射级别2上的2D纹理颜色:
uint x = 7;
uint y = 16;
float4 myColor = myTexture.mips[2][uint2(x,y)];
这是2010年6月及以后的编译器的增强。这个“myTexture.mips[2][uint2(x,y)]”表达式等价于“myTexture.Load(uint3(x,y,2))”。