我有一个着色器,我想在顶点着色器中移动一半顶点。 我试图从性能的角度来决定最好的方法,因为我们处理的是超过100,000个顶点,因此速度至关重要。 我已经看了3种不同的方法:(伪代码,但足以给你一个想法。 <complex formula>我不能给出,但我可以说它涉及一个sin()函数,以及一个函数调用(只返回一个数字,但仍然是一个函数调用),以及一堆关于浮点数的基本算法)。

if (y < 0.5)
{
    x += <complex formula>;
}

这样做的好处是<complex formula>只执行了一半的时间,但缺点是肯定会导致分支,这实际上可能比公式慢。 它是最具可读性的,但在这种情况下我们更关心速度而不是可读性。

x += step(y, 0.5) * <complex formula>;

使用HLSL的step()函数(如果第一个参数更大则返回0,如果更少则返回1),可以消除分支,但现在每次都调用<complex formula> ,并将其结果乘以0(这样浪费了一半的时间。

x += (y < 0.5) ? <complex formula> : 0;

这个我不知道。 ?:引起分支? 如果不是,那么等式的两边都要进行评估,还是只考虑相关的一方?

最后的可能性是<complex formula>可以卸载回CPU而不是GPU,但我担心计算sin()和其他操作会慢一些,这可能会导致净损失。 此外,这意味着必须将另外一个数字传递给着色器,这也可能导致开销。 任何人都有任何见解,哪个是最好的行动方案?


附录:

根据http://msdn.microsoft.com/en-us/library/windows/desktop/bb509665%28v=vs.85%29.aspx

step()函数在内部使用?:所以它可能不比我的第三个解决方案好,并且可能更糟,因为<complex formula>每次都被调用,而它可能只用一半直接调用?: (目前还没有人回答这部分问题。)虽然避免使用和使用:

x += (1.0 - y) * <complex formula>;

可能比其中任何一个都好,因为在任何地方都没有比较。 (并且y始终为0或1.)仍然会在一半时间内执行<complex formula> ,但可能值得完全避免分支。

#1楼 票数:7 已采纳

或许看看这个答案

我的猜测 (这是一个性能问题: 测量它! )是你最好保留if语句。

原因一:理论上(如果正确调用),着色器编译器应该足够聪明,以便在编译if语句时在分支指令和类似step函数之间做出最佳选择。 改进它的唯一方法是剖析[1] 请注意,它可能在此粒度级别依赖于硬件。

[1]或者如果您对如何布置数据有具体的了解,请继续阅读......

第二个原因是着色器单元的工作方式:如果单元中的一个片段或顶点对其他分支或顶点采用不同的分支,则着色器单元必须采用两个分支。 但如果他们都采用相同的分支 - 另一个分支被忽略。 因此,虽然它是每单位而不是每个顶点 - 但仍然可以跳过昂贵的分支。

对于片段,着色器单元具有屏幕上的位置 - 这意味着您可以获得最佳性能,附近像素组都采用相同的分支(请参阅我的链接答案中的插图)。 说实话,我不知道如何将顶点分组为单位 - 但如果您的数据被适当地分组 - 您应该获得所需的性能优势。

最后:值得指出你的<complex formula> - 如果你说你可以手动将它从HLSL中提升出来 - 它可能会被提升到基于CPU的预着色器中(至少在PC上)内存Xbox 360不支持这个,不知道PS3)。 您可以通过反编译着色器来检查这一点。 如果它是你需要每次绘制一次计算的东西(而不是每顶点/片段),那么在CPU上执行它可能最好的。

#2楼 票数:0

我厌倦了我的条件被忽略所以我只是做了另一个内核并在执行中做了覆盖。 如果你需要它一直准确我建议这个修复。

  ask by Darrel Hoffman translate from so

未解决问题?本站智能推荐:

1回复

HLSL着色器的优化

我正在尝试为我的XNA游戏优化地形着色器,因为它似乎消耗了大量资源。 在我的计算机上大约需要10到20 FPS,并且我的地形是512 * 512顶点,因此PixelShader被调用了很多次。 我已经看到分支正在使用一些资源,并且我的着色器中有3/4个条件。 我该怎么做才能绕开它们?
3回复

HLSL着色器的优化

我有一个问题,下面的像素着色器(HLSL)编译为68条指令(使用下面建议的优化)。 但是,我想将它与着色器模型2一起使用,因此不幸的是我最多只能使用64条指令。 有没有人在不改变着色器结果的情况下看到任何可能的优化? 着色器将屏幕的一个或多或少的球形区域(具有正弦形边界)从RGB转换为白
2回复

如何手动或自动优化HLSL(像素)着色器代码?

在计算复杂度方面(意味着:最小化着色器的运行时间),优化HLSL着色器代码的成功策略是什么? 我猜一种方法是减少编译着色器产生的算术运算的数量。 a)手动和b)使用自动化工具(如果有)如何完成? 手工技术集(更新) 避免分支(但是如何做到最好?) 只要有可能:预先计算外部
1回复

HLSL多通

我知道(至少在.fx中为xna项目使用hlsl)每种技术都可以进行多次遍历,并且每一遍都关联了特定的设备状态及其顶点和像素着色器功能。 现在我的问题是:鉴于一项技术中的遍历是一遍又一遍地执行的,每遍遍是否意味着通过渲染管道的完整遍历? 举例来说,如果我有两次通过技术,以下语句是否正确:第一次
1回复

在hlsl中这意味着什么

使用fxcomposer时,.fx文件中有一些代码,我遇到了一些类似这样的代码: <和>包含含义是什么?
2回复

HLSL中的渲染深度

大家好,这应该是一件容易的事,但是由于某些原因,我没有解决这个问题。 我只想使用着色器对场景的深度进行可视化处理: 为了获得深度值(或者我认为是这样),我计算了世界空间中的位置与视图位置之间的距离。 以及相应的像素着色器 结果只不过是白色 因此,我开始尝试并尝试将值乘以深度:
1回复

glslvector*矩阵与hlsl不同

我有两个(相同的)着色器,一个在hlsl中,一个在glsl中。 在像素着色器中,我将矢量乘以矩阵进行正常变换。 代码基本上是: HLSL GLSL 这应该进行行向量乘法,但在glsl中却没有。 如果我明确地输出算法,它适用于两者。 根据我的判断,glsl和hlsl规范都表示,
1回复

短阴影-Monogame/HLSL

我正在尝试找到一种在游戏中为我的精灵实现倾斜阴影的方法。 也就是说,我希望诸如播放器,树木等物体具有基于太阳在天空中的位置的阴影。 例如,该游戏(亚洲帮派)中的阴影: 我曾尝试修改Catalin Zima的方法来满足我的需求,但收效甚微,最终我认为这种方法对我不起作用,而他所做的优化