java - 如何为 Sprite 的特定部分着色

标签 java sprite lwjgl lighting

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

ScreenShot from engine

最佳答案

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

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

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

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

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

只是为了澄清一下本文中某些术语的含义:

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

编辑:

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

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

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

编辑 2:

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

有几种方法可以做到这一点,其中一种是根据顶点的角度对面进行加权。您可以将法线乘以这些角度,然后相加,最后对所得法线进行标准化。

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

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

向上的线是法线,底线是侧 View 中的 Sprite 。

关于java - 如何为 Sprite 的特定部分着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8297885/

相关文章:

css - 图像 Sprite 和跨浏览器兼容性问题

java - 在运行 OSX 10.8.5 的 iMac 上使用 LWJGL 创建 FBO

java - OpenGL - 为什么我的 fbo/纹理保持黑色?

java - java.library.path 中没有 lwjgl - Netbeans

java - 执行java文件并从cmd获取输出

java - JOOQ批量删除ID列表的记录

Java 获取泛型类型的集合

c# - 如何使我的 Sprite 跳跃? (XNA,C#)

java - Runtime.exec() 无法运行 "su - postgres -c ' pg_dump .. .'"

CSS Sprite 问题