SDL2 - 在纹理上绘制完全透明的圆圈

时间:2016-05-28 03:48:37

标签: c++ sdl-2 lighting alphablending

我正在开发SDL 2.0的2D游戏,我的照明系统出了问题。我想用雾填满屏幕并在播放器周围创建一个透明的圆圈(左下角)。我知道如何使用SDL_BLENDMODE_MOD(右下角)制作一个带有色调灯光的暗室,但我无法制造迷雾。我已经尝试使用SDL_SetRenderDrawBlendMode()和SDL_SetTextureBlendMode()的每个组合在屏幕上分层多个纹理。

image

我在StackOverflow上搜索并找到了像this这样的解决方案,但他们使用了SDL曲面和预先制作的光图像。我将动态地改变输入图像的形状和大小(右上角),所以我需要更灵活的东西。

解决方案1:我使用黑色圆圈和海军背景,而不是白色圆圈和黑色背景。然后我使用screen blending混合它并得到我的雾(我在图像编辑器中测试了这个以获得左下角的图像)。不幸的是,SDL没有SDL_BLENDMODE_SCREEN。

解决方案2:创建半透明雾层并在其中打出一个完全透明的孔。不幸的是,我不知道如何用透明孔覆盖纹理。我尝试将drawing mode设置为SDL_BLENDMODE_NONE并绘制一个完全透明的圆圈,但它只会创建完全不透明的圆圈。文档说我可以替换目标alpha,但似乎不起作用......

1 个答案:

答案 0 :(得分:0)

(以下是一系列的建议,而不是明确的答案。如果你可以使用着色器,你的答案就是一个单行片段着色器。除此之外,我不知道一个简单的解决方案,它给你的确切是什么想。)

首先,您可能需要在纹理的Alpha通道(而不是颜色通道)中生成(或存储)您的“蒙版”图像,以使其在Alpha混合中产生任何效果。

我建议在蒙版纹理中使用反转的alpha值:将玩家周围的圆圈(或任何形状)设置为,并在255附近填充雾值“雾值” (或1.0,如果你使用实数。)这可以防止任何东西被画在中间的清晰圆圈中。

现在,如果你用一个坚实的“雾色”填充整个面具纹理(可能不需要制作形状或任何东西),注意不要打扰alpha通道,将SDL_SetTextureBlendMode()设置为{ {1}}并执行SDL_BLENDMODE_BLEND,您将获得类似于您想要的内容。特别是如果你在蒙版纹理中设置了明亮的“雾色”(不是值,颜色),例如比如样本图像中的青色。它不会与您的“屏幕混合模式”完全匹配,但您可以近距离接触。

您也可以尝试使用SDL_RenderCopy()。它甚至可以给你更好的结果(对于模糊效果。)

在任何情况下,重申一下,在雾蒙版纹理(所有混合中的“源”)中,设置一个实心雾色,并将alpha通道设置为实体雾值,然后使用值 在alpha通道中绘制播放器周围的空白区域>