首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL2 -在纹理上绘制完全透明的圆

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

Stack Overflow用户
提问于 2016-05-28 03:48:37
回答 1查看 2K关注 0票数 7

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

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

解决方案1:我使用的不是白色圆圈和黑色背景,而是黑色圆圈和海军背景。然后,我使用筛分混和将其混合,得到我的fog (我已经在图像编辑器中测试了这一点,以获得左下角的图像)。不幸的是,SDL没有SDL_BLENDMODE_SCREEN。

解决方案2:创建一个半透明的雾层,并在其中打一个完全透明的洞。不幸的是,我不知道如何用透明的洞覆盖纹理。我尝试过将我的绘图方式设置为SDL_BLENDMODE_NONE并绘制一个完全透明的圆圈,但它只创建完全不透明的循环。文件上说我可以代替目标阿尔法,但这似乎行不通.

EN

回答 1

Stack Overflow用户

发布于 2016-05-29 05:04:03

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

首先,您可能需要在纹理的alpha通道(而不是颜色通道)中生成(或存储)“掩码”图像,这样它才能在alpha混合中产生任何效果。

我建议在面具纹理中使用一个反转的alpha值:将播放器周围的圆圈(或任何形状)设置为零,并在接近255 (或者1.0,如果使用实数的话)填充雾部分。这样可以防止任何东西在中间清晰的圆圈中画出来。

现在,如果您已经用坚实的“雾色”填充了整个掩膜纹理(可能不需要制作形状或任何东西),请注意不要干扰alpha通道,将SDL_SetTextureBlendMode()设置为SDL_BLENDMODE_BLEND并执行SDL_RenderCopy(),您将实现您想要的结果。特别是,如果你在面具纹理中设置了明亮的“雾色”(不是值,颜色),比如你的样本图像中的青色。它将不完全匹配您的“屏幕混合模式”,但您可以接近。

你也可以用SDL_BLENDMODE_ADD做实验。它甚至可能给你更好的结果(对于雾的影响)。

无论如何,要重申的是,在您的雾掩膜纹理(它是所有混音中的“源”)中,您设置了一个实雾颜色,并将alpha通道设置为一个实心雾值,然后使用的值,仅在alpha通道中绘制播放机周围的清晰区域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37494999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档