如何遮蔽精灵的特定部分

时间:2011-11-28 15:09:59

标签: java sprite lwjgl lighting

我一直在为我计划制作的策略游戏制作等距的Minecraft-esque游戏引擎。如你所见,它确实需要一些照明。很难区分单独的高程,因为一切都是相同的阴影。所以我的问题是:我可以只遮蔽精灵的特定部分吗?所有这些块都只是精灵,所以如果我对整个图像进行着色,它会遮挡整个块。

ScreenShot from engine http://i44.tinypic.com/qxqlix.jpg

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

只是澄清一下这方面的一些术语的含义:

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

修改

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

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

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

编辑2

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

有几种方法可以做到这一点,一种方法是根据该顶点的角度对面进行加权。你可以将法线乘以这些角度,然后加在一起,最后归一化得到的法线。

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

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

指向上方的线条是法线,底线是侧视图中的精灵。