gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:39:32 25 4
gpt4 key购买 nike

我一直在为我计划制作的策略游戏开发等距《我的世界》风格的游戏引擎。正如你所看到的,它确实需要一些照明。很难区分不同的海拔,因为一切都是相同的阴影。所以我的问题是:我可以只对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com