unity-game-engine - 像素化照明着色器

标签 unity-game-engine glsl shader pixel fragment-shader

我已经编写了一个 GLSL 着色器,可在 Unity3D 中与我的像素化 iOS 应用程序一起使用。它有两个一个问题:

1) 效果并不总是与月亮有关,并且 2) 光照看起来并不像素化。

我会解释一下。当月亮位于前景物体后面时,着色器旨在对前景物体产生照明效果。我有一个 Sprite ,通常显示为全黑(如剪影),但是当月亮对象距离它足够近时,它会显示纹理的细节,如下所示:

enter image description here

实际的 Sprite (没有着色器)看起来像这样:

enter image description here

我这样做的原因是这样我就可以得到一张只有一个纹理的光照贴图。但是,它有两个问题:

1) 当我靠近屏幕边缘时,灯光效果并不完全跟随月亮。我不确定这是否与我错误地使用 TEXCOORD1 变量有关。我制作了一个覆盖整个屏幕的 Sprite ,这样您就可以看到它如何不跟随月亮。这是我测试场景中出现问题的效果图。有一个带有黑色条纹和 Alpha 的全屏 Sprite ,可以随时准确显示效果的位置。我想摆脱这种不同步,因为它使照明看起来不真实。

enter image description here

2) 造成的光照效果非常锐利——我想,如果每个像素单独点亮,就像 SpriteLamp 那样,看起来会更好。 。我知道这与舍入着色器中的片段坐标有关,但由于我从来没有真正知道着色器中变量的值是什么,所以我似乎无法让它正常工作。

我可以对距离进行舍入和取整,但后来我得到了这个,它遵循距月球的距离,但不遵循原始 Sprite 中的像素。有像素化,但我们最终得到了这条奇怪的曲线,它应该只是一个像素,如果你明白我的意思的话......

enter image description here

我正在寻找的更像是这样。看看原始纹理的各个像素是如何点亮的?

enter image description here

这是着色器本身的链接:http://pastebin.com/0zbqrP57 。它主要是默认的统一 Sprite 着色器,但在 SampleSpriteTexture 函数末尾添加了一些代码。

这是一个 unitypackage 的链接,您可以使用它来查看着色器的运行情况。只需尝试在场景播放时移动月亮即可。

https://drive.google.com/open?id=0BxCQjUHiAAQWZGpPZ3R2SExTcXc

我的问题:您对如何解决这些问题有什么建议或解决方案吗?

最佳答案

改变

OUT.worldSpacePosition = mul(_Object2World, OUT.vertex);

对于

OUT.worldSpacePosition = mul(_Object2World, IN.vertex);

应该修复月球错位。

对于第二个问题,我想出了这个:

aS = floor(aS * 100) / 100;
bS = floor(bS * 100) / 100;
float dist = sqrt((aS * aS) + (bS * bS));
float percentClose = 1 - (dist / _LightStrength);
float rounded = floor(percentClose * 10) / 10;

if (color.r + color.g + color.b > 0) {
    color.r = lerp(0, color.r, rounded);
    color.g = lerp(0, color.g, rounded);
    color.b = lerp(0, color.b, rounded);
}

我认为你可以将 if 语句和 lerp 删除为:

aS = floor(aS * 100) / 100;
bS = floor(bS * 100) / 100;
float dist = sqrt((aS * aS) + (bS * bS));
float percentClose = 1 - (dist / _LightStrength);
float rounded = floor(percentClose * 10) / 10;
color.rgb *= rounded;

但在这种情况下,您应该在终端设备上测试它并检查它是否提高了性能。

关于unity-game-engine - 像素化照明着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39715811/

相关文章:

c# - 在 HoloLens 2 上的 Unity 应用程序中打开文件浏览器

unity-game-engine - 重命名文件夹后Unity中出现空引用异常

opengl - 我可以在 GLSL 着色器中使用 if else 吗?

java - GLSL LWJGL 问题/着色器无能为力?

3d - 如何引用任意 id<MTLTexture> 以在 SCNTechnique 中使用?

java - 在使用 NVIDIA Geforce 9800 显卡的 Windows Vista 上,GLSL 着色器无法编译并且没有错误消息

c# - Unity3d - 当玩家静止时炮塔停止射击

opengl-es - 顶点万花筒着色器

ios - SceneKit 中用于勾勒对象轮廓的 Metal 着色器

unity-game-engine - 防止物体侧翻;确保它始终面朝上或面朝下落地