C# 二维瓷砖照明

C# 二维瓷砖照明,c#,xna,2d,hlsl,lighting,C#,Xna,2d,Hlsl,Lighting,我正在为基于XNA 2D瓷砖的游戏添加灯光 我发现这篇文章很有用,但它的处理方式不支持冲突。我想要的是一个方法来完成以下工作 一直都是点着的 碰撞(如果光线击中一个块,则将下一个块调暗任意数量,直到其变暗以模拟阴影) 我已经搜索了很长一段时间,但没有找到任何运气(我确实找到了Catalin的教程,但它对我来说似乎有点高级,并且由于为每个点重新绘制了整个游戏,所以不适用于瓷砖)对于每像素照明,你可能必须去其他地方看看,因为我不知道这一点。 对于每瓦照明 在SpriteBatch.draw中,一

我正在为基于XNA 2D瓷砖的游戏添加灯光

我发现这篇文章很有用,但它的处理方式不支持冲突。我想要的是一个方法来完成以下工作

  • 一直都是点着的
  • 碰撞(如果光线击中一个块,则将下一个块调暗任意数量,直到其变暗以模拟阴影)

我已经搜索了很长一段时间,但没有找到任何运气(我确实找到了Catalin的教程,但它对我来说似乎有点高级,并且由于为每个点重新绘制了整个游戏,所以不适用于瓷砖)

对于每像素照明,你可能必须去其他地方看看,因为我不知道这一点。 对于每瓦照明

在SpriteBatch.draw中,一些重载方法采用颜色。使用Color.White时,SpriteBatch绘制的精灵为普通颜色

通过创建新颜色(Color.yourcolor.r*float,Color.yourcolor.y*float,Color.yourcolor.z*float,255)使用颜色乘法


基本上,要获得浮动,请尝试找出一个公式,该公式计算由于附近灯光(可能存储在数组或列表中)而产生的块亮度。因为2D游戏不需要法线,所以这个公式应该相对简单。

我将分享我的方法,将平滑照明效果应用到2D瓷砖网格。ClassicThunder's为阴影提供了一个很好的链接

首先,我们需要计算每个瓷砖的照明值,这些值将在以后模糊。在我进入代码之前,让我先说明一下它是如何工作的

基本上,我们要做的是从顶部开始循环所有瓷砖,如果瓷砖为空白,将
CurrentLight
变量设置为最大亮度,如果我们找到实心瓷砖,将其设置为
CurrentLight
变量,并从
CurrentLight
中减去“吸收”量。这样,在我们的下一个实心平铺上,当我们将平铺设置为
CurrentLight
值时,它会稍微小一些。重复此过程,直到迭代数组

现在将有一个很好的从上到下的照明效果,但它不是很好。我们必须再重复这个过程3次,从下到上,从左到右,从右到左。而且可以重复多次以获得更好的质量

基本上在循环中的每个磁贴上运行此代码

if (tile.Light > CurrentLight) //If this tile is brighter than the last, set the current light to the tiles light
    CurrentLightR = tile.Light;
else if (CurrentLight != 0f) //If it is less, and isnt dark, then set the tile to the current light
    tile.Light = CurLightR;
if (tile.Light == CurLightR) //If it is the same, subtract absorb values
    CurrentLight -= tile.Absorb;

好了,很好的瓷砖照明。但是,如果您想要更少的“像素化”外观,可以查看my。默认行为(颜色*浮动)下的4.0中的-1不会改变亮度/暗度,它会改变透明度@有什么办法吗?这听起来是最好的办法