SDL3_API分类参考_混合模式(CategoryBlendmode)

2026-3-6 / 0 评论 / 4 阅读

混合模式子系统(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

总结

  1. SDL 混合模式核心是 SDL_BlendMode 类型,标准模式(如 SDL_BLENDMODE_BLEND)满足基础需求,自定义模式需通过 SDL_ComposeCustomBlendMode 组合混合因子和运算规则;
  2. FreeBASIC 中使用时,需先通过 SDL_SetTextureBlendMode/SDL_SetRenderDrawBlendMode 为纹理/渲染器设置混合模式,再执行绘制操作;
  3. 混合因子(SDL_BlendFactor)定义源/目标颜色的权重,混合运算(SDL_BlendOperation)定义颜色的计算方式(加法/减法等),二者共同决定最终混合效果。

评论一下?

OωO
取消