个人学习使用,请勿转载
词汇
结构化缓冲区:structured buffer 原始缓冲区:raw buffer
内容
13.3.3利用索引对纹理进行采样
- 纹理元素可以借助2D索引加以访问,基于分派的线程ID来索引纹理,每一个线程都会指定一个唯一的调度ID(调度标识符)
[numthreads(16,16,1)]
void CS(int3 dispatchThreadID : SV_DispatchThreadID)
{
//对两个纹理中横纵坐标分别为x,y出的纹素求和,并将结果存至相应的gOutput纹素中
gOutput[dispatchThreadID].xy=
gInputA[dispatchThreadID.xy]+
gInputB[dispatchThreadID.xy];
}
假设为处理纹理分发了足够多的线程组(一个线程处理一个单独的纹素),这段代码就会将两个纹理图像对应的数据进行累加,再将结果存至gOutput。
- 系统对计算着色器中的索引越界行为由明确的定义,越界的读操作总是返回0,而向越界处写入数据时不会实际执行任和操作。
- 计算着色器运行在GPU上,可以将它作为访问GPU的一般工具,尤其是通过纹理国立进行采样的时候。
- 使用SampleLevel方法而不是Sample方法,SampleLevel需要获取第三个额外的参数来指定mipmap层级。若此参数存在小数部分,则该小数用于在开启mipmap线性过滤的两个mipmap层级之间进行插值。Sample方法会根据屏幕上纹理所覆的像素数自动选择最佳的mipmap层级。计算着色器无法直接参与渲染,因此无法知道sample方法自行选择的mipmap层级。
- 对纹理进行采样时,会使用范围为[0,1]2的归一化纹理坐标,而非整数索引。此时,可以将纹理的大小设置为一个常量缓冲区变量,再利用整数索引(x,y)来求取归一化纹理坐标:
u = x w i d t h u=\frac{x}{width} u