2016-09-27 72 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