2010-09-05 86 views
1

我需要计算分配给从某个角度在屏幕上绘制给定对象时产生的像素的最小和最大UV值。例如,如果我有UV映射的立方体,但只有正面可见,则应将min(UV)和max(UV)设置为分配给可见面像素的最小和最大UV坐标。获取最小和最大渲染的UV值(Direct3D)

我想使用Direct3D 9着色器(以及尽可能最低的着色器模型)来加速处理。顶点着色器可以像获取每个输入顶点的UV坐标一样简单,并将它们未经修改地传递给像素着色器。另一方面,像素着色器必须采用顶点着色器生成的值,并使用它们来计算最小和最大UV值。

我想知道的是:

  1. 如何维持像素着色器的调用之间的状态(电流的最大值和最小值)?
  2. 如何获得着色器生成的最终最小值和最大值到我的程序中?

有没有办法在HLSL中做到这一点,还是我坚持用手工做?如果HLSL不起作用,那么在不使用着色器的情况下最有效的方法是什么?

回答

1

1)你不知道。 2)你将不得不在某个时候回读。这将是一个相当缓慢的过程,并导致管道失速。

总的来说,我想不出一个好办法来做到这一点。你到底在想什么?可能还有其他一些方法可以达到你以后的结果。

您“可能”能够使用多个渲染目标获取某些内容,并将每个像素的UV写入渲染目标。然后,您需要将渲染目标传递回主内存,然后解析它以获取最小值和最大值。这是一个非常缓慢且非常难看的解决方案。

如果你可以把它作为一对单独的传球,你可以渲染到一个非常小的渲染目标,并使用1次传球和1次传球以及1次最小阿尔法混合传球。再次...不是一个好的解决方案。

+0

我需要知道正在采样的UV空间的范围,以便我可以从大纹理图像(对于视频卡要处理的太大)采用矩形部分,并将这些像素复制到足够小以适合的较小纹理视频内存。 – 2010-09-05 21:01:31

+0

为什么不能分割纹理并相应地提前调整UV? – Goz 2010-09-05 21:27:58

+0

我不明白你的意思。如果我不知道要渲染哪个UV空间子集,我将如何知道要复制哪个纹理子集? – 2010-09-05 21:32:43