【问题标题】:Obtaining minimum and maximum rendered UV values (Direct3D)获取最小和最大渲染 UV 值 (Direct3D)
【发布时间】:2010-09-05 20:30:30
【问题描述】:

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

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

我想知道的是:

  1. 如何在像素着色器调用之间保持状态(当前最小值和最大值)?
  2. 如何将着色器生成的最终最小值和最大值放入我的程序中?

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

【问题讨论】:

    标签: graphics direct3d hlsl texture-mapping shader


    【解决方案1】:

    1) 你没有。 2)您必须在某个时候回读。这将是一个相当缓慢的过程并导致管道停顿。

    总的来说,我想不出一个好的方法来做到这一点。你到底想用这个实现什么?可能还有其他方法可以达到您所追求的结果。

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

    如果您可以将其作为几个单独的通道进行,您可能能够渲染到一个非常小的渲染目标,并使用 1 通道和 Max 和 1 通道和 Min alpha 混合操作。再次......不是一个很好的解决方案。

    【讨论】:

    • 我需要知道被采样的 UV 空间的范围,这样我才能从一个大的纹理图像(对于视频卡来说太大而无法处理)中截取一个矩形部分,然后将这些像素复制到一个较小的纹理上小到足以放入视频内存中。
    • 为什么不能提前分割纹理并相应地调整 UV?
    • 我不明白你的意思。如果我不知道正在渲染 UV 空间的哪个子集,我怎么知道要复制纹理的哪个子集?
    • 您不是唯一一个理解失败的人;)但是,因为您肯定知道模型上的 UV 已经是什么?
    • 我没有正确解释自己。由于内存限制,我不能直接使用高分辨率纹理,所以我需要在运行时弄清楚纹理的哪一部分暴露给相机。这个想法是在放大对象时保持合理的像素与纹素比率。 OTOH,我昨天意识到,在 UV 不连续处,最小和最大 UV 不会产生令人满意的结果,因为最小和最大 UV 可能会产生比被采样的纹理区域更大的矩形。我现在打算使用简化的网格和 CPU 处理来确定要使用的 UV 区域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2010-11-23
    相关资源
    最近更新 更多