Graveyard Keeper像素画游戏动态光照实现方法

Graveyard Keeper像素画游戏动态光照实现方法

首页休闲益智画点灯光游戏更新时间:2024-04-09

作者:Svyatoslav Cherkasov

教你画像素画编译出品。

我是游戏“ Graveyard Keeper ” 的首席程序员。我要分享像素画游戏动态光照的一些技巧和窍门。

我们对游戏美术效果充满热情,所以花费了大量时间和精力制作动态光照效果的原因,为了使像素画尽可能具有吸引力。如果你想实现同样的效果,本文会对你有所启发和帮助。

构成我们游戏视觉效果的主要内容:

动态环境光

夜间较暗,白天较亮。灯光颜色设置为渐变色。夜幕降临时,光源不仅会变暗,而且会变成蓝色。它看起来像这样

LUT色彩校正

LUT是一个颜色变化表。粗略地说,它是一个三维RGB阵列,其中每个元素(a)对应一个坐标为RGB值的颜色; (b)包含与元素关联的颜色应更改为的颜色值。因此,如果坐标(1,1,1)处有红点,则表示图片中的所有白色都将替换为红色。但如果在相同坐标处有白色(R = 1,G = 1,B = 1),则不会发生变化。因此,默认情况下,LUT具有与特定颜色相关联的坐标。我的意思是坐标(0.4,0.5,0.8)的点与颜色相关(R = 0.4,G = 0.5,B = 0.8)。

为方便起见,3D纹理表示为二维的。这就是默认LUT(不改变颜色)的样子:

可以从游戏中找出一个场景,告诉美术:“让它看起来像晚上”。然后应用所有颜色层加上默认的LUT。恭喜!你得到一个晚上的LUT。

我们的美术实际上非常热衷于此。他为一天中的不同时间(夜晚,黄昏,傍晚等等)创建了10种不同的LUT ......这就是最终LUT集的外观:

游戏效果

移动光源/法线贴图

我们使用默认的Unity光源。此外,每个精灵都有自己的法线贴图。

这些法线很容易画出来。美术用刷子粗略地在四面画出光线:

然后我们将它们与法线贴图中的脚本合并:

光线3D分布

这是开始变得复杂的地方。你不能只是点亮精灵。精灵是否在光源“后面”或“在它前面”是非常重要的。看下面的图片。

这两棵树与光源的距离相同,但后面的树被照亮而前面的树没有(因为相机面向它的黑暗面)。

我很容易就解决了这个问题。有一个着色器可以计算垂直轴上光源和精灵之间的距离。如果它是正的(光源在精灵前面),我们像往常一样照亮精灵,但如果它是负的(精灵阻挡了光源),那么照明的强度会根据距离的变化而变淡。非常快的速度。有一个速度,而不仅仅是“不要照亮”。因此,如果精灵后面的光源正在移动,则精灵会逐渐变黑,而不是立刻变黑。但它仍然非常快。

投影

阴影是用一个旋转的精灵做的。每个对象最多可以有4个阴影。太阳的阴影和动态光源3个。下图显示了这个概念:

问题:“如何找到最近的3个光源并计算距离和角度,并在运行的脚本Update()循环中解决。

如果今天编程,我会使用Unity Jobs系统。但当时我不得不优化常规脚本。最重要的是我做了精灵旋转而没有在顶点着色器中修改。只需要给精灵一个参数(我使用颜色通道,所有的阴影都是黑色的),而着色器负责精灵旋转。事实证明它更快 - 不必使用Unity几何体。

对每个对象分别调整(有时是绘制)阴影。我们使用了大约10种不同的通用精灵(薄,厚,椭圆等)

下一个问题:难以为沿一个轴拉伸的对象制作阴影。例如,看看栅栏阴影:

雾和高度模拟

游戏中有雾。它看起来像这样(上面的常规版本和极端的100%雾来展示效果)。

从雾中可以看到房屋和树木的顶部。事实上,这种效果很容易实现。雾包含了遍布所有图片的大量水平云。因此,所有精灵的上半部分都覆盖了较少量的雾精灵:

像素画里面的风没有太多选择。只能制作动画或制作变形着色器,不做任何动画,画面看起来会静止而且毫无生气。我们使用了变形着色器。

将着色器应用于方格纹理

我们不会为树的整个树冠制作动画,而是为某些特定的树叶制作动画:

还有麦田摇动动画,这也很简单。改变顶点着色器,考虑y坐标的x坐标的形状。最高点摇动最强烈。麦子上半部分应该摇动,而根部不应该摇动。另外,摇动的阶段根据x / y坐标而变化,以使不同的精灵分开移动。

当玩家经过小麦或草地时,着色器还用于创建摆动效果

完。

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved