【发布时间】:2012-09-26 17:38:05
【问题描述】:
(C++) 标题几乎概括了一切;
我想让光的纹理(或精灵,或其他任何东西)呈现在所有东西的前面如果 3D 空间中的某个点没有隐藏在其他东西后面。 p>
我该怎么做?我可以通过在绘图过程中暂时禁用 Zbuffer 来渲染它,但我不知道如何检查该点是否被隐藏。
我是否必须计算点和相机之间的某种碰撞?或者某种精灵设置会成功吗?
【问题讨论】:
标签: 3d sprite textures directx-9 light
(C++) 标题几乎概括了一切;
我想让光的纹理(或精灵,或其他任何东西)呈现在所有东西的前面如果 3D 空间中的某个点没有隐藏在其他东西后面。 p>
我该怎么做?我可以通过在绘图过程中暂时禁用 Zbuffer 来渲染它,但我不知道如何检查该点是否被隐藏。
我是否必须计算点和相机之间的某种碰撞?或者某种精灵设置会成功吗?
【问题讨论】:
标签: 3d sprite textures directx-9 light
如果我理解您的问题,您想在 3D 空间中渲染 2D 图像 - 使用所有适当的深度缓冲。
我会使用“广告牌”。只需在 3D 空间中渲染一个简单的四边形 - 确保它指向查看器 - 并对其应用“光”纹理。您需要启用 Alpha 混合,否则您只会看到一个贴有图片的大正方形 - 可能不是您要查找的内容。
另一种方法 - 可能工作量更大,但提供更多控制 - 将手动渲染或不使用像素着色器渲染后台缓冲区上的每个像素。这种“混合”在 Frank Luna 的 DirectX 9 书中解释得很简单。
抱歉,我现在看到您的问题的症结在于计算可见性,而不是如何渲染广告牌。
如果您的场景足够简单,“手动计算可见性”可能只是比较您的测试点与一两个其他对象的相机距离。
否则,我认为您使用 ZBuffer 走在正确的轨道上。手动计算测试点的深度(根据 View Frustum 的定义方式从 0.0 标准化到 1.0),将其投影到屏幕空间并将该值与 ZBuffer 中的值进行比较(在相同的投影屏幕空间坐标处)。如果您计算的深度值小于 ZBuffer 中的值,则它是可见的。
这确实是我能想到的确定单个 3D 点可见性的唯一通用方法。
希望对您有所帮助。
【讨论】: