我一直在为我计划制作的策略游戏开发一个等距的 minecraft 游戏引擎。如您所见,它确实需要一些照明。很难区分不同的海拔,因为一切都是相同的阴影。所以我的问题是:我可以只对精灵的特定部分进行着色吗?所有这些块都只是精灵,所以如果我对整个图像进行着色,它将对整个块进行着色。
1 回答
好吧,这取决于您如何进行照明。
基本上,精灵只是由两个三角形组成的带纹理的四边形。
传统的基于顶点的照明(由内置但现已弃用的函数支持)将仅计算该四边形的 4 个角的照明,其他所有内容都将被插值。这是相当快的,但可能会导致错误的照明 - 尤其是聚光灯和大四边形。
如果您只使用定向光照,您可能会将法线贴图应用到您的四边形,从而以每个纹素的方式影响光照,但这可能仍然不是您想要的。
现代方法是使用着色器,即按像素评估照明。然后,您必须为您的四边形提供每个纹理像素的光照信息,然后在片段/像素着色器中使用该信息。
只是为了澄清,一些术语在这种情况下的含义:
- per-texel:纹理中的每个像素,这些值可能会被插值
- per-pixel:每个输出像素,即每个屏幕像素
编辑:
我刚刚看了你的截图,如果相邻的精灵不在同一水平线上,你似乎必须改变精灵边缘的阴影。假设您已经知道哪个精灵边缘应该是可见的(即在该边缘有一个级别变化),您可能只是更改形成该边缘的顶点的阴影。
如果您不使用任何照明,您可能只是开始将顶点颜色设置为白色,并为需要着色的顶点设置一些较暗的颜色。然后将纹理颜色与顶点颜色相乘,这会导致边缘更暗。
或者,如果这些级别具有不同的深度(即不同的 z 值),您可以使用一些着色器进行边缘检测(例如,一些 SSAO 实现)。
编辑 2:
如果您使用普通的旧顶点照明,则应用加权法线可能会有所帮助。基本上,您从共享顶点的那些三角形的法线计算加权顶点法线。
有几种方法可以做到这一点,一种是根据该顶点处的角度对面进行加权。您可以将法线乘以这些角度,然后将它们相加,最后归一化生成的法线。
该计算的结果可能是这样的(ASCII 艺术):
| | /
|_______|________/
| / | |
|/______|_______|
向上的线是法线,底线是侧视图中的精灵。