(Direct3D 10) 选择资源
资源是 3D 管道所使用的数据集合。 对应用程序进行编程的第一步是创建资源并定义其行为。 本指南介绍了选择应用程序所需资源的基本主题。
确定需要资源的管道阶段
第一步是选择将使用资源的 管道阶段 (或阶段) 。 即,确认从资源中读取数据的每个阶段和将数据写入资源的每个阶段。 了解使用资源的管道阶段将确定被调用以将资源绑定到此阶段的 API。
此表列出了可绑定到每个管道阶段的资源类型。 它包括资源是否可以绑定为输入或输出,以及绑定 API。
管道阶段 | 输入/输出 | 资源 | 资源类型 | 绑定 API |
---|---|---|---|---|
输入组装器 | In | 顶点缓冲区 | Buffer | IASetVertexBuffers |
输入组装器 | In | 索引缓冲区 | Buffer | IASetIndexBuffer |
着色器阶段 | In | 着色器资源视图 | 缓冲区,Texture1D,Texture2D,Texture3D | VSSetShaderResources、 GSSetShaderResources、 PSSetShaderResources |
着色器阶段 | In | 着色器常量缓冲区 | Buffer | VSSetConstantBuffers、 GSSetConstantBuffers、 PSSetConstantBuffers |
流输出 | 出 | Buffer | Buffer | SOSetTargets |
输出合并器 | 出 | 呈现器目标视图 | 缓冲区,Texture1D,Texture2D,Texture3D | OMSetRenderTargets |
输出合并器 | 出 | 深度/模具视图 | Texture1D,Texture2D | OMSetRenderTargets |
确定每个资源的使用方式
选择你的应用程序要使用的管道阶段(和每个阶段需要的资源)后,下一步是确定如何使用每个资源,即资源能被 CPU 还是 GPU 访问。
运行你的应用程序的硬件至少需要一个 CPU 和一个 GPU。 若要选取使用情况值,请考虑哪种类型的处理器需要从以下选项中读取或写入资源, (查看 D3D10_USAGE) 。
资源使用情况 | 可如何更新 | 更新频率 |
---|---|---|
默认 | GPU | 不频繁 |
动态 | CPU | 频繁 |
过渡 | GPU | 不适用 |
不可变 | CPU(仅在创建资源时) | 不适用 |
默认用法应用于 CPU 预计不经常更新的资源(每帧少于一次)。 理想情况下,CPU 从不将其直接写入采用默认用法的资源,以避免引起可能的性能损失。
动态用法应用于 CPU 相对经常更新的资源(每帧一次或多次)。 动态资源的典型方案是创建动态顶点和索引缓冲区,这些顶点和缓冲区将在运行时用从用户视角可见的每帧几何图形相关数据进行填充。 这些缓冲区会用于仅呈现该帧对用户可见的几何图形。
临时用法应用于将数据复制到其他资源和从其他资源复制数据。 典型方案为将采用默认用法的资源(CPU 不可访问)中的数据复制到采用临时用法的资源(CPU 可访问)。
资源中的数据从不改变时,应使用不可变资源。
评估这一理念的另一种方法是了解应用程序是如何处理资源的。
应用程序如何使用资源 | 资源使用情况 |
---|---|
一旦加载从不更新 | 不可变或默认 |
应用程序重复填充资源 | 动态 |
渲染到纹理 | 默认 |
CPU 访问 GPU 数据 | 过渡 |
如果你不确定要选择哪个用法,请先使用默认用法,因为它应为最常见的情况。 着色器常量缓冲区是一个应始终采用默认用法的资源类型。
将资源绑定到管道阶段
只要满足创建资源时指定的限制 (使用情况标志、 绑定标志、 cpu 访问 标志) ,资源就可以同时绑定到多个管道阶段。 更具体地说,只要不可同时读取和写入资源的一部分,即可将资源作为输入和输出同时绑定。
绑定资源时,请考虑 GPU 和 CPU 如何访问资源。 用于单一目的的资源(不使用多个用法、绑定和 cpu 访问标志)的性能可能更佳。
例如,考虑多次将呈现器目标用作纹理的情况。 使用两个资源可能更快:一个呈现器目标和一个用作着色器资源的纹理。 每个资源仅使用一个绑定标志 (D3D10_BIND_RENDER_TARGET 或 D3D10_BIND_SHADER_RESOURCE) 。 将使用 CopyResource 或 CopySubresourceRegion 将数据从呈现目标纹理复制到着色器纹理。 这可以通过将呈现器目标写入与着色器纹理读取隔离来提高性能。 当然,确保这两种方法的唯一方法是实现这两种方法,并测量特定应用程序中的性能差异。
相关主题