Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.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
Graphics Direct3D中绘制顶点范围的方法_Graphics_Direct3d_Vertex Buffer - Fatal编程技术网

Graphics Direct3D中绘制顶点范围的方法

Graphics Direct3D中绘制顶点范围的方法,graphics,direct3d,vertex-buffer,Graphics,Direct3d,Vertex Buffer,假设我有一个大的着色器程序,只需要渲染特定范围的顶点/三角形 有哪些有效的方法可以做到这一点?哪一个看起来最有希望? 我想出了3种方法,还有其他的吗 批处理绘图调用draw(位置、计数)使用命令列表。(Opengl具有glmultidrawArray) 如果提前知道范围,我们就不必担心构建它们所花费的时间。但是,由于某些范围会发生不可预测的变化,因此保留所有可能的命令列表可能是不现实的 这种方法明显减少了在CPU端构造draw调用所花费的时间,我假设这些调用已经告诉GPU它不需要做任何状态更改

假设我有一个大的着色器程序,只需要渲染特定范围的顶点/三角形

有哪些有效的方法可以做到这一点?哪一个看起来最有希望?

我想出了3种方法,还有其他的吗

  • 批处理绘图调用
    draw(位置、计数)
    使用命令列表。(Opengl具有
    glmultidrawArray
  • 如果提前知道范围,我们就不必担心构建它们所花费的时间。但是,由于某些范围会发生不可预测的变化,因此保留所有可能的命令列表可能是不现实的

    这种方法明显减少了在CPU端构造draw调用所花费的时间,我假设这些调用已经告诉GPU它不需要做任何状态更改

  • 调用整个缓冲区上的
    Draw
    ,并不断更新逐顶点布尔浮点缓冲区,该缓冲区将在非活动/活动范围内将输出位置乘以0/1
  • 这里的好处只是一次平局。但是,我们需要更新缓冲区,而且在更新缓冲区时,似乎需要锁定缓冲区

  • 在常量缓冲区中定义的功率集。对于n个范围,我们可以使用一个n位常量
    掩码
    ,而不是静态n位
    逐顶点掩码
    。如果
    遮罩和逐顶点遮罩!=0

  • 更新常量缓冲区可能比更新整个顶点缓冲区便宜。但是,对于这种方法来说,范围的数量可能太大。

    您可能已经知道,您应该尝试各种方法,并对其进行客观评估。您是否发现了应用程序中的瓶颈?我认为这个问题无法回答。“顶点/三角形范围”顶点还是三角形?是否索引?有没有实例?有多少范围?通常范围有多长?范围的源数据在哪里,在系统RAM或VRAM中,例如由计算着色器生成的?