我不知道您在编程什么,但这就是我在XNA中处理它的方式:
- 在绘图调用中,将
List<Light>
创建/清除对象。
- 在图块绘制循环期间,将检查每个图块以查看是否有任何与之关联的灯光。如果是这样,则将
Light
对象附加到List<Light>
。
- 瓷砖绘制在自己的瓷砖上
RenderTarget2D
。
- 瓷砖循环后,列表
Light
S通过迭代和自己绘制RenderTarget2D
使用纹理我做的,看起来像这样:
(注:我这里使用的R,G和B值,但你应该使用Alpha通道在实际纹理。)
- 使用自定义着色器,我将瓷砖表面渲染到屏幕上,并将照明表面作为参数传递给每个像素,以获取“暗度”值的参数。
现在,有几件事要注意:
关于第4点:
我实际上有两个自定义着色器,一个用于将灯光绘制到照明渲染目标(步骤4),另一个用于使用照明渲染目标将平铺渲染目标绘制到屏幕(步骤5)。
在第4点使用的着色器允许我添加(称为)“亮度”值。该值是一个float
在与纹理中的每个像素相乘之前将其相乘的值,这样我就可以从本质上使光源更亮或更暗。
在这一点上,我还考虑了光源的“比例”值,这意味着仅使用一种纹理就可以使用大型或小型光源。
关于第5点:
可以将照明渲染目标视为每个像素从0(黑色)到1(白色)的值。着色器实质上是将该值与图块渲染目标中像素的RGB值相乘,以生成最终绘制的图像。
我在这里还有一些其他代码,在其中我将(一个值)用作日夜覆盖色传递给着色器。这也将乘以RGB值,并包含在照明渲染目标计算中。
现在,这将不允许您执行诸如阻止光线绕过对象之类的操作,但至少出于我的目的,它很简单并且效果很好。
我在这里和这里都写了更详细的博客文章,可能会对您有所帮助。我现在没有时间,但是如果您愿意,我可以在这里详细介绍gamedev。
哦,这是我的地图编辑器中的内容: