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