混合模式子系统(CategoryBlendmode)
混合模式用于定义两种颜色的混合规则:SDL 既提供满足基础需求的标准混合模式,也支持创建自定义混合模式(可指定对颜色分量执行的数学运算规则)。
函数
- SDL_ComposeCustomBlendMode:组合自定义混合模式(指定源因子、目标因子、混合运算,生成自定义 SDL_BlendMode)
数据类型
- SDL_BlendMode:混合模式类型(包含标准模式和自定义模式的句柄)
结构体
- (无)
枚举
- SDL_BlendFactor:混合因子枚举(定义源/目标颜色的加权系数,如 SDL_BLENDFACTOR_SRC_ALPHA、SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA)
- SDL_BlendOperation:混合运算枚举(定义源颜色和目标颜色的计算方式,如 SDL_BLENDOPERATION_ADD、SDL_BLENDOPERATION_SUBTRACT)
宏
- (无)
FreeBASIC 示例代码
' 引入 SDL 相关声明(需确保 FreeBASIC 已链接 SDL 库)
#Include "SDL.bi"
' 主程序示例
Dim As SDL_Window Ptr window = NULL
Dim As SDL_Renderer Ptr renderer = NULL
Dim As SDL_Texture Ptr texture1 = NULL, texture2 = NULL
Dim As SDL_Rect rect1, rect2
Dim As SDL_BlendMode customBlendMode ' 自定义混合模式
Dim As Integer quit = 0
Dim As SDL_Event evt
' 初始化函数
Function InitBlendModeDemo() As Integer
' 初始化 SDL 视频子系统
If (SDL_Init(SDL_INIT_VIDEO) < 0) Then
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "SDL 初始化失败:%s", SDL_GetError())
Return 0
End If
' 创建窗口和渲染器
window = SDL_CreateWindow("SDL 混合模式示例", _
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, _
800, 600, SDL_WINDOW_SHOWN)
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED)
If (window = NULL Or renderer = NULL) Then
SDL_LogError(SDL_LOG_CATEGORY_RENDER, "创建窗口/渲染器失败:%s", SDL_GetError())
Return 0
End If
' 创建两个半透明矩形纹理
' 纹理1:红色半透明
texture1 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, _
SDL_TEXTUREACCESS_TARGET, 200, 200)
SDL_SetRenderTarget(renderer, texture1)
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 128) ' 红,半透明
SDL_RenderClear(renderer)
SDL_SetRenderTarget(renderer, NULL)
' 纹理2:绿色半透明
texture2 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, _
SDL_TEXTUREACCESS_TARGET, 200, 200)
SDL_SetRenderTarget(renderer, texture2)
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 128) ' 绿,半透明
SDL_RenderClear(renderer)
SDL_SetRenderTarget(renderer, NULL)
' 定义绘制位置(重叠)
rect1.x = 200 : rect1.y = 150 : rect1.w = 200 : rect1.h = 200
rect2.x = 300 : rect2.y = 250 : rect2.w = 200 : rect2.h = 200
' 1. 使用标准混合模式(SDL_BLENDMODE_BLEND)
SDL_SetTextureBlendMode(texture1, SDL_BLENDMODE_BLEND)
SDL_SetTextureBlendMode(texture2, SDL_BLENDMODE_BLEND)
' 2. 创建自定义混合模式(加法混合:源*1 + 目标*1)
customBlendMode = SDL_ComposeCustomBlendMode( _
SDL_BLENDFACTOR_ONE, ' 源因子:源颜色完全保留
SDL_BLENDFACTOR_ONE, ' 目标因子:目标颜色完全保留
SDL_BLENDOPERATION_ADD, ' 混合运算:加法
SDL_BLENDFACTOR_ONE, ' Alpha 源因子
SDL_BLENDFACTOR_ONE, ' Alpha 目标因子
SDL_BLENDOPERATION_ADD ' Alpha 混合运算
)
Return 1
End Function
' 渲染函数
Sub RenderFrame(useCustomBlend As Integer)
' 清空背景为白色
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255)
SDL_RenderClear(renderer)
' 根据参数切换混合模式
If (useCustomBlend) Then
SDL_SetTextureBlendMode(texture1, customBlendMode)
SDL_SetTextureBlendMode(texture2, customBlendMode)
SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "使用自定义加法混合模式")
Else
SDL_SetTextureBlendMode(texture1, SDL_BLENDMODE_BLEND)
SDL_SetTextureBlendMode(texture2, SDL_BLENDMODE_BLEND)
SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "使用标准混合模式")
End If
' 绘制两个重叠纹理
SDL_RenderTexture(renderer, texture1, NULL, @rect1)
SDL_RenderTexture(renderer, texture2, NULL, @rect2)
' 提交渲染结果
SDL_RenderPresent(renderer)
End Sub
' 清理资源
Sub Cleanup()
If (texture1 <> NULL) Then SDL_DestroyTexture(texture1)
If (texture2 <> NULL) Then SDL_DestroyTexture(texture2)
If (renderer <> NULL) Then SDL_DestroyRenderer(renderer)
If (window <> NULL) Then SDL_DestroyWindow(window)
SDL_Quit()
End Sub
' 主程序
If (InitBlendModeDemo() = 0) Then
Cleanup()
End 1
End If
Dim As Integer useCustom = 0
' 主循环
While (quit = 0)
While (SDL_PollEvent(@evt))
Select Case evt.type
Case SDL_QUITEVENT
quit = 1
Case SDL_KEYDOWN
' 按空格键切换混合模式
If (evt.key.keysym.sym = SDLK_SPACE) Then
useCustom = Not useCustom
End If
End Select
Wend
' 渲染帧(切换混合模式)
RenderFrame(useCustom)
' 控制帧率
SDL_Delay(16)
Wend
Cleanup()
End 0
总结
- SDL 混合模式核心是
SDL_BlendMode类型,标准模式(如SDL_BLENDMODE_BLEND)满足基础需求,自定义模式需通过SDL_ComposeCustomBlendMode组合混合因子和运算规则; - FreeBASIC 中使用时,需先通过
SDL_SetTextureBlendMode/SDL_SetRenderDrawBlendMode为纹理/渲染器设置混合模式,再执行绘制操作; - 混合因子(
SDL_BlendFactor)定义源/目标颜色的权重,混合运算(SDL_BlendOperation)定义颜色的计算方式(加法/减法等),二者共同决定最终混合效果。
评论一下?