2016-05-28 80 views
4

我正在開發SDL 2.0中的2D遊戲,並且我的照明系統有問題。我想用霧氣填滿屏幕,並在玩家周圍創建一個透明的圓圈(左下角)。我知道如何使用SDL_BLENDMODE_MOD(右下)創建帶有淺色燈光的暗室,但我無法制作霧。我已經嘗試過使用SDL_SetRenderDrawBlendMode()和SDL_SetTextureBlendMode()我可以想到的每種組合在屏幕上分層的多個紋理。SDL2 - 在紋理上繪製全透明圓圈

image

我已經搜查,發現解決方案在計算器上一樣this,但他們使用SDL表面和預製的光圖像。我將會動態地改變我的輸入圖像的形狀和大小(右上角),所以我需要更靈活的東西。

解決方案1:我使用黑色圓圈和海軍背景,而不是白色圓圈和黑色背景。然後我使用screen blending來混合這個,並獲得我的霧(我已經在圖像編輯器中測試了這個以獲得左下圖像)。不幸的是,SDL沒有SDL_BLENDMODE_SCREEN。

解決方案2:創建一個半透明霧層和在其衝壓一個完全透明的孔。不幸的是,我不知道如何用透明的洞覆蓋紋理。我試圖將我的drawing mode設置爲SDL_BLENDMODE_NONE並繪製一個完全透明的圓,但它只會創建完全不透明的圓。文檔說我可以代替目的地阿爾法,但似乎並沒有工作......

回答

0

(下面是一系列的建議,沒有一個明確的答案。如果你可以使用着色器,你的答案是一維襯墊片段着色器除此之外,我不知道一個簡單的解決方案,它給出了你想要的東西。)

首先,你可能需要在alpha通道中生成(或存儲)你的「mask」圖像紋理(而不是顏色通道),因爲它對alpha混合有任何影響。

我建議在蒙版貼圖中使用倒置的alpha值:將玩家周圍的圓形(或任何形狀)設置爲,並使用「霧值」在255附近(或1.0,如果您使用的是實數。)這可以防止任何東西在中間的清晰圓圈中繪製。

現在,如果您已經用完整的「霧色」(可能不需要製作任何形狀或任何形狀)填充完整蒙版紋理,請注意不要打擾Alpha通道,請將SDL_SetTextureBlendMode()設置爲SDL_BLENDMODE_BLEND並執行SDL_RenderCopy(),你會得到你想要的東西。特別是如果你在蒙版紋理中設置了明亮的「霧色」(不是數值,顏色),例如就像您樣本圖像中的青色一樣。它不會完全符合你的「屏幕混合模式」,但你可以關閉。

你還可以用SDL_BLENDMODE_ADD嘗試爲好。它可能甚至會給你更好的效果(對於霧效果)。

在任何情況下,重申,在你的霧蒙版紋理(這是所有混合中的「源」),你設置一個堅實的霧顏色,並設置alpha通道到固體霧值,然後畫清晰區域周圍的alpha通道僅玩家,使用的的值。

+0

如何存放在紋理的Alpha值的圖像?我知道如何將RenderCopy()紋理映射到另一個紋理,但我不知道如何訪問紋理的Alpha通道。 – DragonDePlatino