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

C++ SDL2-在纹理上绘制完全透明的圆,c++,sdl-2,lighting,alphablending,C++,Sdl 2,Lighting,Alphablending,我正在SDL2.0中开发一个2D游戏,我的照明系统有问题。我想用雾填充屏幕,并在播放器周围创建一个透明的圆圈(左下)。我知道如何使用SDL_BLENDMODE_MOD(右下角)创建一个带有有色灯光的黑暗房间,但我无法生成雾。我尝试过使用SDL_SetRenderDrawBlendMode()和SDL_SetTextureBlendMode()的每一种组合在屏幕上分层多个纹理 我在StackOverflow上搜索并找到了解决方案,但它们使用SDL曲面和预制作的灯光图像。我将动态地改变输入图像的形

我正在SDL2.0中开发一个2D游戏,我的照明系统有问题。我想用雾填充屏幕,并在播放器周围创建一个透明的圆圈(左下)。我知道如何使用SDL_BLENDMODE_MOD(右下角)创建一个带有有色灯光的黑暗房间,但我无法生成雾。我尝试过使用SDL_SetRenderDrawBlendMode()和SDL_SetTextureBlendMode()的每一种组合在屏幕上分层多个纹理

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

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

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

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

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

和我建议在掩码纹理中使用一个倒置的α值:将玩家周围的圆(或任何形状)设置为零,并在255附近(或1,如果使用实数)填充雾部分,这样可以防止任何东西在中间的清晰圆中画出。

现在,如果您已使用纯色“雾色”(可能不需要制作形状或任何东西)填充整个遮罩纹理,注意不要干扰alpha通道,请将
SDL\u SetTextureBlendMode()
设置为
SDL\u BLENDMODE\u BLEND
,然后执行
SDL\u RenderCopy()
,您将获得您想要的效果。特别是如果您在遮罩纹理中设置了明亮的“雾色”(非值,颜色),例如,像示例图像中的青色。它不会完全匹配你的“屏幕混合模式”,但你可以接近

您还可以尝试使用
SDL\u BLENDMODE\u ADD
。它甚至可能给你更好的效果(对于雾状效果)


在任何情况下,重申一下,在雾遮罩纹理(这是所有混合中的“源”)中,设置实心雾颜色,并将alpha通道设置为实心雾值,然后仅在alpha通道中绘制播放器周围的透明区域,使用零的值

如何将图像存储在纹理的alpha值中?我知道如何将一个纹理渲染到另一个纹理,但我不知道如何访问纹理的alpha通道。