SDL 中的 Alpha 混合在调整大小后重置 window
Alpha Blending in SDL resets after resizing window
我想在我的纹理中实现 alpha 混合 class。它几乎完全有效。我使用以下函数来操作 alpha 值:
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(texture, alpha);
我遇到的唯一问题是,当我调整大小或最大化 window 时,已被操纵的纹理似乎重置为正常的 alpha 值 255。我检查了 alpha 值并认识到它仍然是我之前操纵它的值。所以该值不是 255。为什么渲染器将其渲染为 alpha 值当时为 255?
关于我如何以及何时使用这些功能的信息:
在主游戏循环中,我使用纹理的 public 方法更改纹理的 alpha 值 class:
Texture::setAlphaValue(int alpha)
Texture class 的私有 alpha 变量已更改。
在我的 Texture class 的 Draw 方法中绘制纹理并调用
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(texture, alpha);
之前
SDL_RenderCopyEx(renderer, texture, &sourceRectangle, &destinationRectangle, 0, 0, SDL_Flip);
有关如何调整大小的信息 window:
我基本上只是在我的 SDL 初始化中将 window 模式设置为可调整大小的 window。然后像处理任何正常的 window 一样处理它是可能的:
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。在这个项目中我简化了一切,甚至没有纹理 class 了。所以代码真的很简单,但是bug还是存在。这是 Visual Studio 项目的 link:http://www.dropbox.com/s/zaipm8751n71cq7/Alpha.rar
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
You should directly change the alpha in this area.
example: alpha = 100;
SDL_SetTextureAlphaMod(texture, alpha); //remember that alpha is an int
SDL_RenderCopy(renderer, texture, NULL, &rect);
P.S。如果你想要 fade-out/fade-in 效果,调整大小会暂时暂停 alpha 变化(以防你使用 SDL_GetTicks() 并随着时间的推移使浮动缓慢 reduce/increase alpha。这是因为 windows 会暂停程序内的渲染,但一旦您停止调整大小,它就会恢复。
另一个P.S。由于您正在调整 window 的大小,因此请确保将 w 和 h 值分配为乘积或动态数字而不是数字(乘法比除法快,但您也可以使用除法)。
分配静态数字会导致 window 调整大小,但内部纹理不会改变大小。
快乐编码:)
好的,这似乎只是一个错误。我不是唯一遇到此问题的人:有人已经将此作为错误报告给错误跟踪器。这是 link:https://bugzilla.libsdl.org/show_bug.cgi?id=2202.
希望 SDL 团队能够修复它!
我想在我的纹理中实现 alpha 混合 class。它几乎完全有效。我使用以下函数来操作 alpha 值:
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(texture, alpha);
我遇到的唯一问题是,当我调整大小或最大化 window 时,已被操纵的纹理似乎重置为正常的 alpha 值 255。我检查了 alpha 值并认识到它仍然是我之前操纵它的值。所以该值不是 255。为什么渲染器将其渲染为 alpha 值当时为 255?
关于我如何以及何时使用这些功能的信息:
在主游戏循环中,我使用纹理的 public 方法更改纹理的 alpha 值 class:
Texture::setAlphaValue(int alpha)
Texture class 的私有 alpha 变量已更改。
在我的 Texture class 的 Draw 方法中绘制纹理并调用
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
SDL_SetTextureAlphaMod(texture, alpha);
之前
SDL_RenderCopyEx(renderer, texture, &sourceRectangle, &destinationRectangle, 0, 0, SDL_Flip);
有关如何调整大小的信息 window:
我基本上只是在我的 SDL 初始化中将 window 模式设置为可调整大小的 window。然后像处理任何正常的 window 一样处理它是可能的:
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。在这个项目中我简化了一切,甚至没有纹理 class 了。所以代码真的很简单,但是bug还是存在。这是 Visual Studio 项目的 link:http://www.dropbox.com/s/zaipm8751n71cq7/Alpha.rar
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
You should directly change the alpha in this area.
example: alpha = 100;
SDL_SetTextureAlphaMod(texture, alpha); //remember that alpha is an int
SDL_RenderCopy(renderer, texture, NULL, &rect);
P.S。如果你想要 fade-out/fade-in 效果,调整大小会暂时暂停 alpha 变化(以防你使用 SDL_GetTicks() 并随着时间的推移使浮动缓慢 reduce/increase alpha。这是因为 windows 会暂停程序内的渲染,但一旦您停止调整大小,它就会恢复。
另一个P.S。由于您正在调整 window 的大小,因此请确保将 w 和 h 值分配为乘积或动态数字而不是数字(乘法比除法快,但您也可以使用除法)。 分配静态数字会导致 window 调整大小,但内部纹理不会改变大小。
快乐编码:)
好的,这似乎只是一个错误。我不是唯一遇到此问题的人:有人已经将此作为错误报告给错误跟踪器。这是 link:https://bugzilla.libsdl.org/show_bug.cgi?id=2202.
希望 SDL 团队能够修复它!