SDL2 - 在纹理上渲染透明通道

3
我正在寻找一种特定于纹理阿尔法通道的渲染方法。我的想法是在运行时创建一个“掩码”,即渲染一个纹理,该纹理将作为另一个纹理的阿尔法通道。
请注意:我知道如何使用阿尔法通道和颜色关键字,所以请不要解释这些内容 :) 我要做的是找到一种使用其他纹理在运行时动态生成掩码的方法。
我更喜欢利用图形卡的解决方案,而不是涉及获取像素缓冲区并在 CPU 中操纵它们的方法。
这可行吗?
2个回答

4

为了帮助其他有兴趣的人,我自己回答:

  1. 我使用的遮罩是黑白纹理:黑色是不透明的,白色是透明的。可以通过渲染到纹理来生成遮罩。
  2. 当遮罩纹理准备好后,我将其复制到另一个纹理中,并反转所有像素。我们称这个新纹理为“反转遮罩”。
  3. 在渲染我想要应用遮罩的纹理之前,我在相同的位置和大小上使用加法混合渲染反转遮罩纹理。这将创建一个白色轮廓,形状与我想要应用的遮罩相同(因为它是加法的,所以黑色像素是透明的)。
  4. 然后我使用加法混合在我想要应用遮罩的纹理上渲染遮罩本身。这将使背景变为白色(遮罩应该是透明的像素现在变成了白色。因为是加法,黑色像素没有影响)
  5. 最后,我使用模式混合在第3步中渲染的白色轮廓上完全渲染纹理。背景的白色像素将是透明的(因为是模式混合),而之前白色轮廓的部分现在将是经过遮罩的纹理。

注意:这不是理想的方法,它涉及多次渲染和操作纹理像素。但对于我的特定情况来说足够了,而且它是纯SDL,对我来说已经足够好了。


你是在使用CPU反转掩码吗?因为此时,通过目标纹理流一次并简单地将alpha字节设置为所需值,然后执行混合渲染复制,这样不是更快吗?我真的希望未来的OpenSDL包括一个基本着色器,因为自己进行组合要高效得多。 :) - user2465201

2
抱歉如果我理解有误,但是由于您说“在 alpha 通道上”,所以从图形学的角度来看,一个通道只是图像的一个子组,与 RGB 通道、黑白通道、声音通道(用于深度等)等一起。但我认为您想表达的是将另一张图片放在原始遮罩层的顶部,并且顶部的图片应该看起来像是覆盖在下面的图片上(然后调整透明度),从而呈现出“遮罩”的效果。 例如: 新娘戴着面纱(新娘的脸是原始图片,而面纱是半透明的。通过观察,你会认为两个是同一张图片)。
有两种方法可以实现这一点,其中第一种最简单:
1.编辑将充当遮罩的图像并在图像处理程序中更改其不透明度,记得以 PNG 格式保存。这样做后,先将第一张图片渲染到纹理中,然后再渲染编辑过不透明度的图片。
2.与第一种方法相同,但不要编辑第二张图片,而是在 SDL2 中编辑其 alpha 通道。(使用此方法,您可以根据时间动态控制它,并将其渲染到纹理中利用图形卡。)
两种方法都会呈现出两张合并的照片,第二张图片充当遮罩。

不,您完全没有理解我的意思 :) 我想要创建类似于模板缓冲区的东西,但是是2D的,并且使用SDL。并且它需要在运行时进行,因此我无法使用图像编辑软件来编辑Alpha通道。无论如何还是谢谢。 - Ronen Ness
你应该在描述中提到模板缓冲区,哈哈哈哈,既然你提到了mask*,那么我猜你正在创建像阴影这样的复杂东西?无论如何,为了限制渲染,你可以创建另一个矩形来表示纹理的裁剪值(假设你正在从下面限制它在表面上),你可以通过表面下方的边缘来控制它的w和h。 - kdyz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接