DirectX,3D模型前面的光线不隐藏时

时间:2012-09-26 17:38:06

标签: 3d sprite textures directx-9 light

(C ++) 标题几乎总结了一切;

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

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

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

1 个答案:

答案 0 :(得分:1)

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

我会使用“广告牌”。只需在3D空间中渲染一个简单的四边形 - 确保它指向观察者 - 并将“光”纹理应用于它。你想要启用alpha混合,否则你只会看到一个大方块上贴有照片 - 可能不是你想要的。

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

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

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

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

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

希望有所帮助。