3d DirectX,未隐藏时三维模型前面的光线

3d DirectX,未隐藏时三维模型前面的光线,3d,sprite,textures,directx-9,light,3d,Sprite,Textures,Directx 9,Light,(C++) 标题几乎概括了这一切 如果3D空间中的某个点没有隐藏在其他东西后面,我想让灯光的纹理(或精灵,或其他任何东西)呈现在所有东西的前面 我该怎么做?我可以通过在绘图过程中临时禁用Zbuffer来渲染所有内容,但我不知道如何检查该点是否被隐藏 我必须计算点和相机之间的某种碰撞吗?或者某种精灵设置会成功吗?如果我理解您的问题,您希望在3D空间中渲染2D图像,并使用所有适当的深度缓冲 我会用“广告牌”。只需在3D空间中渲染一个简单的四边形,确保它指向观看者,并对其应用“灯光”纹理。你会想要启用

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

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

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


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

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

我会用“广告牌”。只需在3D空间中渲染一个简单的四边形,确保它指向观看者,并对其应用“灯光”纹理。你会想要启用alpha混合,否则你只会看到一个大正方形,上面贴着一张图片——可能不是你想要的

另一种方法——可能需要更多的工作,但需要更多的控制——是手动渲染或不使用像素着色器渲染后缓冲区上的每个像素。这种“混合”在弗兰克·卢纳的DirectX 9书中解释得非常简单

对不起,我现在明白了,问题的关键是计算可见性,而不是如何渲染广告牌

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

否则,我认为你在ZBuffer的正确轨道上。手动计算测试点的深度(根据视锥台的定义从0.0规范化到1.0),将其投影到屏幕空间,并将该值与ZBuffer中的值进行比较(在相同的投影屏幕空间坐标下)。如果计算的深度值小于ZBuffer中的值,则该值可见

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


希望这能有所帮助。

这已经是我用来绘制图像的方法了,但是当某个点不可见时,我如何将其隐藏起来,当它可见时,如何将其置于所有其他点之上?好的,如果目标是在“某个点”不可见时完全关闭它,我会手动计算该点的可见性,然后只渲染/不渲染公告牌。至于使它在顶部-我只会渲染它在屏幕空间。完美!确切地现在,如何计算该点的可见性?xD(实际上,我指的是渲染灯光图像的点,因此,如果有更简单的方法,可能会很受欢迎!)这是一个很好的答案,但忽略了Direct3D提供了“遮挡查询”机制(请参见D3DQUERYTYPE_遮挡)。要测试点的可见性,请启动遮挡查询,在该点渲染一些测试几何体,结束查询并检查通过可见性检查的像素数的结果。另一方面,这可能有点过分,直接检查深度缓冲区更好。我尝试了这个查询(想测试它们是如何工作的),它工作得很好,谢谢!非常感谢大家!:)