我目前正在从DirectDraw升级系统(是的,我知道,它已经很老了)。它是一个2D系统,但模拟真实世界,因为每个对象都有一个以米为单位的范围/深度。有一个背景图像被渲染并保持在最远的z顺序上。所有其他对象都在它上面绘制,并根据它们的范围/深度进行缩放。但是,我所拥有的某种类型的对象被定义为多边形并呈现略有不同。它充当了一个看不见的封堵器。例如,封堵器的范围/深度为40(我的单位是米),并且由视口中间的5个顶点(五边形)定义。在相同的视口位置有一个精灵对象但是在50的范围/深度。所需的输出是不渲染精灵对象,但应该通过它们看到背景。所以本质上这些是不可见的遮挡物,除了它们不会遮挡背景。
作为一个注释,封堵器和精灵都来自相同的基础对象类型,并在深度排序的容器中混合在一起。
我的想法是覆盖遮挡器渲染方法,以便它们绘制到渲染目标,写入范围/深度值。然后我会将精灵渲染为正常,但在顶点或像素着色器中会将精灵的范围值与渲染目标中的范围值进行比较。但是,在我看来,在调用Present之前,我必须在同一个传递中从渲染目标读取/写入,并且这是未定义的。如果我要渲染遮挡物,取消绑定渲染目标并传递纹理以供其他对象查找,我将必须将精灵位置转换为该纹理空间,这可能是非平凡的。这些方法中的任何一种都可以吗?
在考虑了更多关于它之后,又想到了另一个想法。我可以把遮挡物和参考背景纹理设置它们的纹理坐标。通过这种方式,他们将绘制与背景相同的颜色值,并且由于排序,如果精灵在其后面,用户仍然会看到“背景”,但实际上它是封堵器看起来像它。
很抱歉,如果这不是一个问题,而是更多地思考,但我希望获得关于最佳方式的印象和想法。在我看来,我有选择,但不确定哪个是最有效的,哪个是最简单的。提前感谢任何回复。
答案 0 :(得分:0)
正如我在评论中所述,我选择了参考背景图像设置纹理坐标,然后确保封闭器(一个简单的多边形)被正确地三角化以利用这些纹理坐标。