gpt4 book ai didi

graphics - directx 中多种复杂对象的典型渲染策略?

转载 作者:行者123 更新时间:2023-12-01 19:43:31 29 4
gpt4 key购买 nike

我正在学习directx。它在如何做事方面提供了巨大的自由,但可能不同的策略表现不同,并且它几乎没有提供关于什么是性能良好的使用模式的指导。

使用 directx 时,是否通常需要在每次渲染时多次交换一堆新数据?

最明显但可能效率很低的使用方式就是这样。

策略1

在每个渲染中

  1. 加载模型 0 的所有内容(包括纹理)并渲染它(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)

  2. 加载模型 1 的所有内容(包括纹理)并渲染它(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)

  3. 等等...

我猜如果要加载的最大的东西被给予专用的插槽,例如,您可以在一定程度上提高效率。如果模型 0 的纹理确实很复杂,则不要在每个步骤中重新加载它,只需将其加载到插槽 1 中并保留在那里即可。当然,因为我不确定 DX11 中每种类型肯定有多少个寄存器,所以这很复杂(有人能指出这方面的文档吗?)

策略2

选择一些纹理槽用于加载,其他纹理槽用于永久存储最复杂的纹理。

仅一次

将最复杂的模型、着色器和纹理加载到专用于永久存储的插槽中

在每个渲染上

  1. 使用为加载和渲染预留的插槽加载模型 0 尚未存在的所有内容(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)

  2. 使用为加载和渲染预留的插槽加载模型 1 尚未存在的所有内容(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)

  3. 等等...

策略3我不知道,但以上可能都是错误的,因为我对此真的很陌生。

在 directx(特别是 DX11)上高效渲染的标准策略是什么,以使其尽可能高效?

最佳答案

DirectX 会为您管理资源,并尝试尽可能长时间地将它们保留在视频内存中以优化性能,但只能达到卡中视频内存的限制。即使资源仍在视频内存中,每次状态更改也会产生开销。

优化此问题的一般策略是最大限度地减少渲染过程中状态更改的数量。通常,这意味着在批处理中绘制使用相同纹理的所有多边形,以及在批处理中使用相同顶点缓冲区的所有对象。因此,通常在更改状态以绘制更多图元之前,您会尝试绘制尽可能多的图元

这通常会使渲染代码变得更加复杂且难以维护,因此您需要进行一些分析以确定您愿意进行多少优化。

通常,通过超出本问题范围的更通用的算法更改,您将获得更好的性能提升。一些示例是减少远处对象和遮挡查询的多边形数量。一个流行的真实说法是“最快的多边形是你不绘制的多边形”。以下是一些快速链接:

http://msdn.microsoft.com/en-us/library/bb147263%28v=vs.85%29.aspx

http://www.gamasutra.com/view/feature/3243/optimizing_direct3d_applications_.php

http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter06.html

关于graphics - directx 中多种复杂对象的典型渲染策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6418616/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com