我正在使用SDL 2.0开发2D游戏,我的光照系统存在问题。我想用雾填充屏幕,并在玩家周围创建透明的圆圈(左下角)。我知道如何使用SDL_BLENDMODE_MOD创建有色光源的黑暗房间(右下角),但是我无法创建雾气效果。我尝试使用每种SDL_SetRenderDrawBlendMode()和SDL_SetTextureBlendMode()的组合来覆盖多个纹理层在屏幕上,但是没有成功。我在StackOverflow上搜索到了一些解决方案,例如这里,但它们使用SDL surfaces和预先制作的灯光图像。我将动态更改输入图像(右上角)的形状和大小,因此需要更灵活的解决方案。
解决方案1:不使用白色圆圈和黑色背景,而是使用黑色圆圈和深蓝色背景。然后使用屏幕混合混合它得到雾效果(我在图像编辑器中测试过这个方法并得到了左下角的图像)。不幸的是,SDL没有SDL_BLENDMODE_SCREEN。
解决方案2:创建一个半透明的雾层并在其中打一个全透明的洞。不幸的是,我不知道如何用透明洞覆盖一个纹理。我尝试将绘画模式设置为SDL_BLENDMODE_NONE,并绘制一个完全透明的圆圈,但它只会创建完全不透明的圆圈。文档说可以替换目标alpha,但这似乎不起作用...
解决方案1:不使用白色圆圈和黑色背景,而是使用黑色圆圈和深蓝色背景。然后使用屏幕混合混合它得到雾效果(我在图像编辑器中测试过这个方法并得到了左下角的图像)。不幸的是,SDL没有SDL_BLENDMODE_SCREEN。
解决方案2:创建一个半透明的雾层并在其中打一个全透明的洞。不幸的是,我不知道如何用透明洞覆盖一个纹理。我尝试将绘画模式设置为SDL_BLENDMODE_NONE,并绘制一个完全透明的圆圈,但它只会创建完全不透明的圆圈。文档说可以替换目标alpha,但这似乎不起作用...
sdl2-gfx
来绘制圆形,它会明确地将混合模式更改为SDL_BLENDMODE_ALPHABLEND
,完全忽略你设置的混合模式。这里的(可怕的)解决方案是不使用 alpha 进行绘制,然后通过SDL_ComposeCustomBlendMode
使用自定义混合模式将光层合并。 - Sandy Maguire