c – SDL2 – 在纹理上绘制完全透明的圆圈
我正在开发SDL 2.0中的2D游戏,我的照明系统遇到了麻烦.我想用雾填满屏幕并在播放器周围创建一个透明的圆圈(左下角).我知道如何使用SDL_BLENDMODE_MOD(右下角)制作一个带有色调灯光的暗室,但我无法制造迷雾.我已经尝试使用SDL_SetRenderDrawBlendMode()和SDL_SetTextureBlendMode()的每个组合在屏幕上分层多个纹理.
我在StackOverflow上搜索并找到了像this这样的解决方案,但他们使用的是SDL曲面和预先制作的光图像.我将动态地改变输入图像的形状和大小(右上角),所以我需要更灵活的东西. 解决方案1:我使用黑色圆圈和海军背景,而不是白色圆圈和黑色背景.然后我使用screen blending混合它并得到我的雾(我在图像编辑器中测试了这个以获得左下角的图像).不幸的是,SDL没有SDL_BLENDMODE_SCREEN. 解决方案2:创建半透明雾层并在其中打出一个完全透明的孔.不幸的是,我不知道如何用透明孔覆盖纹理.我已经尝试将我的drawing mode设置为SDL_BLENDMODE_NONE并绘制一个完全透明的圆,但它只创建完全不透明的圆.文档说我可以替换目标alpha但这似乎不起作用… 解决方法
(以下是一系列建议,而不是明确的答案.如果你可以使用着色器,你的答案是一个单行片段着色器.除此之外,我不知道一个简单的解决方案,它给出了你想要的.)
首先,您可能需要在纹理的Alpha通道(而不是颜色通道)中生成(或存储)您的“蒙版”图像,以使其在Alpha混合中具有任何效果. 我建议在蒙版纹理中使用反转的alpha值:将玩家周围的圆圈(或任何形状)设置为零,并使用接近255的“雾值”填充雾部分(如果使用实数,则填充1.0) .)这可以防止任何东西被画在中间的清晰圆圈中. 现在,如果你用一个坚实的“雾色”填充整个蒙版纹理(可能不需要制作形状或任何东西),注意不要打扰alpha通道,将SDL_SetTextureBlendMode()设置为SDL_BLENDMODE_BLEND并执行SDL_RenderCopy( ),你会实现你想要的东西.特别是如果你在蒙版纹理中设置了明亮的“雾色”(不是值,颜色),例如比如样本图像中的青色.它不会与您的“屏幕混合模式”完全匹配,但您可以接近. 您也可以尝试使用SDL_BLENDMODE_ADD.它甚至可以给你更好的效果(对于模糊效果.) 在任何情况下,重申一下,在雾蒙版纹理(在所有混合中都是“源”)中,设置实心雾色,并将Alpha通道设置为实心雾值,然后在周围绘制清晰区域仅限alpha通道中的玩家,使用零值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |