2016-05-28 79 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