【问题标题】:DirectX, light rays in front of 3D models when not hiddenDirectX,未隐藏时在 3D 模型前面的光线
【发布时间】:2012-09-26 17:38:05
【问题描述】:

(C++) 标题几乎概括了一切;

我想让光的纹理(或精灵,或其他任何东西)呈现在所有东西的前面如果 3D 空间中的某个点没有隐藏在其他东西后面。 p>

我该怎么做?我可以通过在绘图过程中暂时禁用 Zbuffer 来渲染它,但我不知道如何检查该点是否被隐藏。

我是否必须计算点和相机之间的某种碰撞?或者某种精灵设置会成功吗?

【问题讨论】:

    标签: 3d sprite textures directx-9 light


    【解决方案1】:

    如果我理解您的问题,您想在 3D 空间中渲染 2D 图像 - 使用所有适当的深度缓冲。

    我会使用“广告牌”。只需在 3D 空间中渲染一个简单的四边形 - 确保它指向查看器 - 并对其应用“光”纹理。您需要启用 Alpha 混合,否则您只会看到一个贴有图片的大正方形 - 可能不是您要查找的内容。

    另一种方法 - 可能工作量更大,但提供更多控制 - 将手动渲染或不使用像素着色器渲染后台缓冲区上的每个像素。这种“混合”在 Frank Luna 的 DirectX 9 书中解释得很简单。

    抱歉,我现在看到您的问题的症结在于计算可见性,而不是如何渲染广告牌。

    如果您的场景足够简单,“手动计算可见性”可能只是比较您的测试点与一两个其他对象的相机距离。

    否则,我认为您使用 ZBuffer 走在正确的轨道上。手动计算测试点的深度(根据 View Frustum 的定义方式从 0.0 标准化到 1.0),将其投影到屏幕空间并将该值与 ZBuffer 中的值进行比较(在相同的投影屏幕空间坐标处)。如果您计算的深度值小于 ZBuffer 中的值,则它是可见的。

    这确实是我能想到的确定单个 3D 点可见性的唯一通用方法。

    希望对您有所帮助。

    【讨论】:

    • 嗯,这已经是我用来绘制图像的方法了,但是当某个点不可见时如何隐藏它并在它出现时将其置于其他所有内容之上?
    • 好的,如果目标是在“某个点”不可见的情况下完全关闭它,我将手动计算该点的可见性并仅渲染/不渲染广告牌。至于让它在顶部 - 我只会在屏幕空间中渲染它。
    • 完美!确切地!现在,我如何计算该点的可见性? xD(实际上,在某些方面,我的意思是我渲染光的图像的点,所以如果有更简单的方法来实现这一点,欢迎!)
    • 很好的答案,但忽略了 Direct3D 提供了“遮挡查询”机制(msdn.microsoft.com/en-us/library/windows/desktop/…msdn.microsoft.com/en-us/library/windows/desktop/… - 请参阅 D3DQUERYTYPE_OCCLUSION)。要测试一个点的可见性,请启动一个遮挡查询,在该点渲染一些测试几何图形,结束查询并检查有多少像素通过了可见性检查的结果。另一方面,也许这对你正在做的事情来说有点矫枉过正,直接检查深度缓冲区会更好。
    • 我尝试了查询(想测试它们是如何工作的),它工作得很好,谢谢!非常感谢大家! :)
    猜你喜欢
    • 2021-12-30
    • 2017-08-05
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多