2016-09-27 91 views
7

我已经写了一个GLSL着色器用于Unity3D与我的像素化iOS应用程序。它有两个一个问题:像素化照明着色器

1)效果并不总是与月亮保持一致,并且 2)照明看起来不像素化。

我稍后再解释一下。着色器意味着当月亮在它后面时对前景物体产生光照效果。我有它通常显示为全黑(如轮廓)一个精灵,而当月亮的对象是非常接近它,它揭示了纹理细节,像这样:

enter image description here

实际精灵(没有着色器)看起来是这样的:

enter image description here

的原因,我这样做的效果这种方式让我可以有只有一个纹理光照。但是,它有两个问题:

1)当我靠近屏幕边缘时,光线效果并不完全跟随月亮。我不确定这是否与我错误地使用TEXCOORD1变量相关。我制作了一个覆盖整个屏幕的精灵,让你可以看到它不跟随月球。下面是我的测试场景中效果问题的图片。有一个带有黑色条纹和alpha的全屏精灵,可以随时显示效果的确切位置。我想摆脱这种异步,因为它使照明看起来不切实际。

enter image description here

2)引起的照明效果是非常尖锐的 - 它会更好看,我认为,如果每个像素被单独点燃,如SpriteLamp。我知道这与在着色器中舍入碎片坐标有关,但由于我从不真正知道变量的值在我的着色器中,我似乎无法使其正确工作。

我可以围绕和落地的距离,但然后我得到这个,这是服从月球的距离,但不服从原始精灵像素。有像素化,但我们最终什么对面应该只是一个像素,如果你明白我的意思这个奇怪的曲线......

enter image description here

我在寻找什么是更喜欢这一点。看看原始纹理的各个像素是如何点亮的?

enter image description here

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

下面是一个unitypackage的链接,您可以使用它来查看着色器的行为。试着在场景播放时尝试移动月亮。

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

我的问题:你有没有关于如何解决这些问题,或解决方案给他们什么建议吗?

+2

我理解你的问题,但你并没有一个具体的问题了。你想了解为什么desync发生?期待解决方法的建议?这里的目标究竟是什么?请编辑。 – XenoRo

+0

嗨,@AlmightyR,谢谢你的建议。我期待建议和解决方案。我已经更新了这个问题。目标是在问题#2中实现效果(因为它会比当前设置更好),并解决异步问题。 – Catlard

+1

哇,它像一个魅力。谢谢 – Learner

回答

2

更改

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); 
} 

我想如果语句,您可以删除和lerps只是:

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; 

但在这种情况下,你应该测试它在你的结束设备并检查它是否改善性能。

+0

第一次修复很棒!你能解释为什么它不同吗?但像素化的照明方案并不是我想要的。对不起,没有更具体。我已经更新了这个问题。 *弓* – Catlard

+0

要清楚,我了解如何/为什么我们摆脱条件,但为什么IN.vertex不同于OUT.vertex?那里发生了什么? 您是否看到我的更新?让我知道你是否真的不明白。 – Catlard

+0

我真的不知道为什么它不同。即使你改变了'OUT.vertex = UnityObjectToClipPos(IN.vertex);'到'OUT.vertex = IN.vertex;'并且摆脱了UnityPixelSnap(),它将无法正常工作。也许更有经验的人可以解释这一点。 你能再次上传unitypackage吗?我打破了月亮材料和/或雪碧。 – Krajca