Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 高效的DirectX渲染_C#_Graphics_Directx_Sharpdx - Fatal编程技术网

C# 高效的DirectX渲染

C# 高效的DirectX渲染,c#,graphics,directx,sharpdx,C#,Graphics,Directx,Sharpdx,我正在尝试编写一个DirectX 9.0控件,该控件将多个二维形状渲染到一个曲面上,并允许用户与这些形状交互。到目前为止,我已经能够将一百万个不同颜色的三角形渲染到网格上,然后用户可以使用鼠标在网格上平移和缩放。然而,我相信,没有等待。。我知道我做这件事效率很低。。。 目前,我为每个三角形都有一个顶点缓冲区,在每次渲染时,我都设置流源并在一个巨大的for循环中绘制基本体。在一个实验中,我尝试创建一个包含单个三角形的顶点缓冲区,在另一个For循环中,我将更改世界变换并绘制基本体。表演糟透了。

我正在尝试编写一个DirectX 9.0控件,该控件将多个二维形状渲染到一个曲面上,并允许用户与这些形状交互。到目前为止,我已经能够将一百万个不同颜色的三角形渲染到网格上,然后用户可以使用鼠标在网格上平移和缩放。然而,我相信,没有等待。。我知道我做这件事效率很低。。。

目前,我为每个三角形都有一个顶点缓冲区,在每次渲染时,我都设置流源并在一个巨大的for循环中绘制基本体。在一个实验中,我尝试创建一个包含单个三角形的顶点缓冲区,在另一个For循环中,我将更改世界变换并绘制基本体。表演糟透了。

我真正需要的是某种方法来存储几个独特的形状(大约100个),并在全世界给它们打上1000或10000多次的印记。我还希望能够更改形状的单个实例的颜色。我不需要花哨的灯光/纹理/或诸如此类的东西。只是简单的颜色。


那么,实现这一点的典型DirectX方法是什么

有一些技巧可以用于此;当你的场景变得更加复杂时,我会开始研究并转向支持之类的东西

生成一个巨大的顶点和索引缓冲区,并使用索引缓冲区告诉它要使用缓冲区中的哪些顶点。您甚至可以优化以减少顶点缓冲区中重复顶点的数量(如果有很多重叠),但即使是简单的实现也应该更快

如果要渲染大量变换的形状,使用顶点着色器是将处理难题转移到设计为并行处理的设备上的一种很好的方法

使用着色器而不是固定的函数管道后,您可以随每个顶点传递信息(可能在Z值或纹理坐标中对其进行编码),告知GPU在像素着色器最终光栅化到屏幕时在像素着色器中执行什么操作(例如,更改基元的颜色)


无论哪种方式,您的目标都是显著减少发送到GPU和从GPU发送的次数,因为每次使状态“不同步”(例如,当您更改转换时)都要支付罚金。通常情况下,每帧向卡片发送一次大团块比在整个帧过程中发送成吨的小团块要快。

有几种方法可用于此;当你的场景变得更加复杂时,我会开始研究并转向支持之类的东西

生成一个巨大的顶点和索引缓冲区,并使用索引缓冲区告诉它要使用缓冲区中的哪些顶点。您甚至可以优化以减少顶点缓冲区中重复顶点的数量(如果有很多重叠),但即使是简单的实现也应该更快

如果要渲染大量变换的形状,使用顶点着色器是将处理难题转移到设计为并行处理的设备上的一种很好的方法

使用着色器而不是固定的函数管道后,您可以随每个顶点传递信息(可能在Z值或纹理坐标中对其进行编码),告知GPU在像素着色器最终光栅化到屏幕时在像素着色器中执行什么操作(例如,更改基元的颜色)


无论哪种方式,您的目标都是显著减少发送到GPU和从GPU发送的次数,因为每次使状态“不同步”(例如,当您更改转换时)都要支付罚金。通常,每帧向卡片发送一个大团块比在整个帧过程中发送成吨的小团块要快。

谢谢您的回复!我以前读过这两篇文章,我想我最终会沿着这条路线走下去。我不确定是否有一种很好的方法可以在固定管道中完成所有这些,或者大部分优势是否在可编程管道中。假设我有一个描述三角形的顶点缓冲区,我可以使用多个(或一个更大的)索引缓冲区来创建多个三角形,你是说我可以使用着色器将每个三角形转换到一个唯一的位置?顶点着色器在我看来是这种情况下的最佳做法。将大顶点缓冲区与大索引缓冲区结合使用可能只会为您节省一点存储空间(因为您可以消除重复的顶点),但顶点着色器可以让您非常快速地进行每个形状的变换。感谢您的回复!我以前读过这两篇文章,我想我最终会沿着这条路线走下去。我不确定是否有一种很好的方法可以在固定管道中完成所有这些,或者大部分优势是否在可编程管道中。假设我有一个描述三角形的顶点缓冲区,我可以使用多个(或一个更大的)索引缓冲区来创建多个三角形,你是说我可以使用着色器将每个三角形转换到一个唯一的位置?顶点着色器在我看来是这种情况下的最佳做法。将大顶点缓冲区与大索引缓冲区结合使用可能只会为您节省一点存储空间(因为您可以消除重复的顶点),但顶点着色器可以让您非常快速地进行逐形状变换。