作者: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