【问题标题】:Alpha Blending in SDL resets after resizing window调整窗口大小后,SDL 中的 Alpha 混合会重置
【发布时间】:2015-04-04 16:55:50
【问题描述】:

我想在我的 Texture 类中实现 alpha 混合。它几乎完全有效。我使用以下函数来操作 alpha 值:

SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(texture, alpha);

我遇到的唯一问题是,当我调整或最大化窗口时,已操作的纹理似乎重置为正常的 alpha 值 255。我检查了 alpha 值,发现它仍然是我之前操纵它的值。所以这个值不是 255。为什么渲染器会渲染它,就好像 alpha 值是 255 一样呢?

有关我如何以及何时使用这些功能的信息:

在主游戏循环中,我使用 Texture 类的公共方法更改纹理的 alpha 值:

Texture::setAlphaValue(int alpha)

Texture 类的私有 alpha 变量已更改。

在我的 Texture 类的 Draw 方法中,纹理被绘制,我调用

 SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
 SDL_SetTextureAlphaMod(texture, alpha);

之前

 SDL_RenderCopyEx(renderer, texture, &sourceRectangle, &destinationRectangle, 0, 0, SDL_Flip);

有关我如何调整窗口大小的信息:

我基本上只是在我的 SDL 初始化中将窗口模式设置为可调整大小的窗口。然后像任何普通窗口一样处理它是可能的:

SDL_CreateWindow(window_Title, x_Position, y_Position, window_Width, window_Height, SDL_WINDOW_RESIZABLE);  

我的主要循环区域:

这是主游戏循环:

 void Game::Render()
 {
     // set color and draw window       

     SDL_SetRenderDrawColor(renderer, windowColor.R(), windowColor.G(), windowColor.B(), 0);

     SDL_RenderClear(renderer); 

     texture.setAlphaValue(100);
     texture.Draw(SDL_FLIP_NONE);

     // present/draw renderer

     SDL_RenderPresent(renderer);   
 }

测试我的项目:

我还将我的 alpha 混合测试项目上传到了 Dropbox。在这个项目中,我简化了一切,甚至不再有纹理类。所以代码真的很简单,但是bug还是存在的。这是 Visual Studio 项目的链接:http://www.dropbox.com/s/zaipm8751n71cq7/Alpha.rar

【问题讨论】:

  • 如何调整窗口大小?
  • @Zammalad 我将窗口模式设置为 SDL_WINDOW_RESIZABLE 然后它就像任何程序一样只是一个普通窗口,可以通过将鼠标移动到它的边框来调整大小。
  • 所以你调用SDL_SetTextureBlendModeSDL_SetTextureAlphaMod每一帧,即在调用中绘制纹理。您的纹理类是否存储值 alpha 或者是您传递给 Draw 函数的参数。
  • 您使用的是哪个版本的 SDL?
  • 看起来很奇怪。我现在忙于很多工作,但在周末我会尝试将一个基本的应用程序放在一起来反映你正在做的事情,看看我是否能得到同样的效果。听起来你做的一切都是正确的。我还建议在 SDL 论坛上发帖询问是否有人也看过此内容。

标签: c++ sdl alpha sdl-2 blending


【解决方案1】:

SDL_SetTextureBlendMode(纹理, SDL_BLENDMODE_BLEND);

你应该直接改变这个区域的alpha。

示例:alpha = 100;

SDL_SetTextureAlphaMod(纹理, alpha); //记住alpha是一个int

SDL_RenderCopy(renderer, texture, NULL, &rect);

附:如果您想要淡出/淡入效果,调整大小将暂时暂停 alpha 更改(如果您使用 SDL_GetTicks() 并进行浮动以随着时间的推移慢慢减少/增加 alpha。这是因为 Windows暂停程序内部的渲染,但一旦停止调整大小,它就会恢复。

另一个 P.S.由于您正在调整窗口大小,请确保将 w 和 h 值分配为不是数字,而是作为产品或动态数字(乘法比除法更快,但您也可以使用除法)。 分配静态数字会导致窗口调整大小,但里面的纹理不会改变大小。

快乐编码:)

【讨论】:

  • 我尝试直接更改值,但没有效果。调整窗口大小后,alpha 值似乎仍然被重置。因此,我是在类的公共方法中还是直接更改变量都无关紧要。这似乎确实是由 SDL lib 引起的问题,而不是由我引起的......
  • 我在输入答案之前在我的项目上做了这个,它实际上对我有用 0_0。
  • 尝试删除这个 -> Texture::setAlphaValue(int alpha) 和这个 -> SDL_RenderCopyEx(renderer, texture, &sourceRectangle, &destinationRectangle, 0, 0, SDL_Flip);然后使用我输入的代码进行快速调试。
  • 我这样做了,但错误仍然存​​在,它并没有解决我的问题:/
  • 能否请您编辑您的帖子并向我们展示您的主要循环区域?这也可以帮助其他人注意到您的错误。老实说,根据您的描述,我看不到错误,因此我什至对其进行了测试。
【解决方案2】:

好吧,这似乎只是一个错误。我不是唯一一个遇到这个问题的人:有人已经将此作为 bug 报告给 bugtracker。这是链接:https://bugzilla.libsdl.org/show_bug.cgi?id=2202

希望 SDL 团队能够修复它!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多