directx中许多不同复杂对象的典型渲染策略?

Joh*_*son 9 directx graphics rendering directx-11

我正在学习directx.它在如何做事方面提供了大量的自由,但可能不同的状态不同表现不同,并且它对于表现良好的使用模式提供的指导很少.

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

使用它的最明显,也可能是非常低效的方式就是这样.

Stragety 1

在每个渲染上

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

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

  3. 等等...

我猜你可以提高效率,如果要加载的最大东西都是专用插槽,例如,如果模型0的纹理真的很复杂,不要在每一步重新加载它,只需将它加载到插槽1中并保留它那里.当然,因为我不确定DX11中每种类型的寄存器有多少,所以这很复杂(任何人都可以指出这方面的文档吗?)

Stragety 2

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

只有一次

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

在每个渲染上

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

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

  3. 等等...

策略3 我不知道,但上面的内容可能都错了,因为我真的很陌生.

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

dsc*_*fer 2

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