【发布时间】:2013-09-23 07:24:39
【问题描述】:
我正在尝试使用 GPU 实现一种复杂的算法。唯一的问题是硬件限制,最大可用功能级别为 9_3。
算法基本上是两个图像的“立体匹配”算法。由于上述限制,所有计算都必须仅在顶点/像素着色器中执行(没有可用的计算 API)。顶点着色器在这里相当无用,所以我将它们视为直通顶点着色器。
让我简要描述一下算法:
-
取两张图像并计算成本体积图(基本上将 RGB 转换为灰度 -> 将右图像转换为 D 并从左图像中减去它)。对于生成 Texture3D 的不同 D,此步骤重复大约 20 次。
这里的问题:我不能简单地创建一个像素着色器来计算 由于 Pixel 的大小限制,一口气重复了 20 次 着色器(最多 512 个算术),所以我不得不在循环中调用 Draw() 在 C++ 中,在所有操作都完成时不必要地涉及 CPU 同样的两张图片 - 在我看来,我有一个瓶颈。我知道有多个渲染目标,但是:有最大值。 8 个目标(我需要 20+),如果我想在一个像素着色器中生成 8 个结果,我会超出它的大小限制(我的硬件为 512 算术)。
-
然后我需要计算每个计算的纹理框过滤器,其中 r > 9。
这里的另一个问题: 因为窗口太大,我需要将框过滤分成两个像素着色器(分别垂直和水平方向),因为循环展开阶段会导致代码很长。这些循环的手动实现无济于事,因为它仍然会创建大像素着色器。所以另一个这里的瓶颈 - CPU 需要参与将结果从临时纹理(V 通道的结果)传递到第二通道(H 通道)。
-
然后在下一步中,对来自第一步和第二步的每对结果应用一些算术运算。
我的发展还没有到这里,所以不知道什么样的瓶颈在等着我。
-
然后根据步骤 3 中的像素值为每个像素获取最小 D(第 1 步中的参数值)。
...与第 3 步相同。
这里基本上是一个非常简单的图表,显示了我当前的实现(不包括步骤 3 和 4)。
红点/圆圈/任何东西都是临时缓冲区(纹理),其中存储部分结果,并且每个红点 CPU 都会参与其中。
问题1: 是不是可以让GPU知道如何在不涉及CPU并导致瓶颈的情况下将每个分支形式执行到底? IE。一次性对图形管道序列进行编程,然后让 GPU 完成它的工作。
另外一个问题关于渲染到纹理的事情:即使在 Draw() 方法调用和像素/顶点着色器切换之间,所有纹理是否一直驻留在 GPU 内存中?或者发生从 GPU 到 CPU 的任何传输......因为这可能是另一个导致瓶颈的问题。
任何帮助将不胜感激!
提前谢谢你。
最好的问候, 卢卡斯
【问题讨论】:
标签: image-processing directx shader pixel-shader