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

Dra*_*ino 5 c++ alphablending lighting sdl-2

我正在使用 SDL 2.0 开发 2D 游戏,但我的照明系统出现问题。我想用雾填充屏幕并在玩家周围创建一个透明圆圈(左下)。我知道如何使用 SDL_BLENDMODE_MOD(右下)制作一个带有彩色灯光的暗室,但我无法制作雾气。我尝试使用我能想到的 SDL_SetRenderDrawBlendMode() 和 SDL_SetTextureBlendMode() 的每种组合在屏幕上分层多个纹理。

图片

我已经搜查,在计算器上像发现解决这个,但他们使用SDL表面和预先制作的光图像。我将动态更改输入图像(右上角)的形状和大小,因此我需要更灵活的东西。

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

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

yzt*_*yzt 0

(以下是一系列建议,而不是明确的答案。如果您可以使用着色器,那么您的答案是单行片段着色器。除此之外,我不知道一个简单的解决方案可以准确地提供您想要的内容。)

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

我建议在蒙版纹理中使用反转的 alpha 值:将玩家周围的圆圈(或任何形状)设置为零并用接近 255(或 1.0,如果您使用实数)的“雾值”填充雾部分.)这可以让您防止在中间的透明圆圈中绘制任何内容。

现在,如果你已经用纯“雾色”填充了整个蒙版纹理(可能不需要制作形状或任何东西),请注意不要干扰 alpha 通道,将你的设置为SDL_SetTextureBlendMode()SDL_BLENDMODE_BLEND执行 a SDL_RenderCopy(),你将实现类似的效果你想要什么。特别是如果您在蒙版纹理中设置了明亮的“雾色”(不是值,颜色),例如示例图像中的青色。它不会完全匹配您的“屏幕混合模式”,但您可以接近。

SDL_BLENDMODE_ADD您也可以尝试一下。它甚至可能会给你更好的结果(雾化效果。)

无论如何,重申一下,在雾蒙版纹理(这是所有混合中的“源”)中,设置纯雾颜色,并将 alpha 通道设置为纯雾值,然后绘制周围的清晰区域仅在 alpha 通道中的播放器,使用值。