【问题标题】:2D Tile Lighting2D 瓷砖照明
【发布时间】:2012-03-25 23:06:06
【问题描述】:

我正在为基于 XNA 2D 瓦片的游戏添加光照。

我发现this 文章很有用,但它的完成方式不支持碰撞。我想要的是一种执行以下操作的方法

  • 始终点亮点
  • 碰撞(如果光线击中一个方块,则将下一个方块调暗,直到其变暗以模拟阴影)

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

【问题讨论】:

    标签: c# xna 2d hlsl lighting


    【解决方案1】:

    我将分享我将平滑光照效果应用于 2D 平铺网格的方法。 ClassicThunder 的answer 提供了一个很好的阴影链接。

    首先,我们需要计算每个图块的光照值,这些图块稍后会被模糊。在进入代码之前,让我先说明一下这是如何工作的。

    基本上我们所做的是循环遍历所有的瓷砖,从顶部开始,如果瓷砖是空白的,将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;
    

    你去了,漂亮的瓷砖照明。但是,如果您想要一个不那么“像素化”的外观,您可以查看我的question on gamedev

    【讨论】:

      【解决方案2】:

      对于每像素照明,您可能需要寻找其他地方,因为我不知道。 对于每瓦照明,

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

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2016-11-19
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多