[C++]DirectX 12 3D游戏开发实战—第13章 学习笔记03 2019.5.12

本文档介绍了DirectX 12中使用计算着色器对纹理进行索引采样和结构化缓冲区资源的操作。通过调度ID索引纹理,并解释了纹理采样中的SampleLevel方法与Sample方法的区别。同时,详细阐述了结构化缓冲区的定义和使用,包括如何创建和绑定到流水线,并提到了原始缓冲区的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人学习使用,请勿转载

词汇

结构化缓冲区: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的一般工具,尤其是通过纹理国立进行采样的时候。
    1. 使用SampleLevel方法而不是Sample方法,SampleLevel需要获取第三个额外的参数来指定mipmap层级。若此参数存在小数部分,则该小数用于在开启mipmap线性过滤的两个mipmap层级之间进行插值。Sample方法会根据屏幕上纹理所覆的像素数自动选择最佳的mipmap层级。计算着色器无法直接参与渲染,因此无法知道sample方法自行选择的mipmap层级。
    2. 对纹理进行采样时,会使用范围为[0,1]2的归一化纹理坐标,而非整数索引。此时,可以将纹理的大小设置为一个常量缓冲区变量,再利用整数索引(x,y)来求取归一化纹理坐标:
      u = x w i d t h u=\frac{x}{width} u
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值