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