【问题标题】:How to shade a specific section of a sprite如何对精灵的特定部分进行着色
【发布时间】:2019-08-15 03:40:37
【问题描述】:

我一直在为我计划制作的一款策略游戏开发一个等距的《我的世界》式游戏引擎。如您所见,它确实需要一些照明。很难区分不同的海拔,因为一切都是相同的阴影。所以我的问题是:我可以只对精灵的特定部分进行着色吗?所有这些块都只是精灵,所以如果我对整个图像进行着色,它将对整个块进行着色。

【问题讨论】:

  • 你应该在姐妹网站 gamedev.stackexchange.com 上问这个问题,他们可能会给你更好的答案。

标签: java sprite lwjgl lighting


【解决方案1】:

嗯,这取决于你如何进行照明。

基本上,精灵只是由两个三角形组成的带纹理的四边形。

传统的基于顶点的照明(由内置但现已弃用的函数支持)只会计算该四边形的 4 个角的照明,其他所有内容都将被插值。这是相当快的,但可能会导致错误的照明 - 尤其是聚光灯和大四边形。

如果您只使用定向光照,您可能会将法线贴图应用到四边形,从而以逐纹素的方式影响光照,但这可能仍然不是您想要的。

现代方法是使用着色器,即按像素评估照明。然后,您必须为您的四边形提供每个纹理像素的光照信息,然后在片段/像素着色器中使用该信息。

只是为了澄清,一些术语在这种情况下的含义:

  • per-texel:纹理中的每个像素,这些值可能会被插值
  • 每像素:每输出像素,即每屏幕像素

编辑

我刚刚查看了您的屏幕截图,如果相邻的精灵不在同一水平面上,您似乎必须更改精灵边缘的阴影。假设您已经知道哪个精灵边缘应该是可见的(即该边缘有一个级别变化),您可能只需更改形成该边缘的顶点的阴影。

如果您不使用任何照明,您可能只是开始将顶点颜色设置为白色,并为需要着色的顶点设置一些较暗的颜色。然后将纹理颜色与顶点颜色相乘,这会导致边缘变暗。

或者,如果这些级别具有不同的深度(即不同的 z 值),您可以使用一些着色器进行边缘检测(例如一些 SSAO 实现)。

编辑 2

如果您使用普通的旧顶点照明,则应用加权法线可能会有所帮助。基本上,您可以根据共享顶点的三角形的法线计算加权顶点法线。

有几种方法可以做到这一点,一种是根据顶点处的角度对面进行加权。您可以将法线乘以这些角度,然后相加,最后归一化生成的法线。

该计算的结果可能是这样的(ASCII 艺术):

|       |         /
|_______|________/             
                 | /     |       |
                 |/______|_______| 

向上的线是法线,底部的线是侧视图中的精灵。

【讨论】:

  • 但问题是,我不知道如何为精灵的一部分着色。只是整个事情。
  • 我会研究顶点着色,看看我是否可以解决一些问题来使这些边缘变暗。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
相关资源
最近更新 更多