SDL渲染器和纹理

文章目录

渲染器 (SDL_Renderer)

:它是渲染内容的接口,负责将内容绘制到窗口中。通过SDL_CreateRenderer创建,可以设置渲染器的背景颜色、绘图颜色、透明度等。所有绘图操作(如绘制线条、矩形、纹理等)都通过渲染器执行。

纹理 (SDL_Texture)

:纹理是一种优化后的图像资源,存储于GPU显存中,允许快速渲染。使用SDL_CreateTextureFromSurface加载图像文件生成纹理,或者通过SDL_CreateTexture创建空白纹理。纹理加载到渲染器后可直接绘制,提升渲染效率。

使用方式:

创建渲染器:SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

加载纹理:通过SDL_CreateTextureFromSurface(renderer, surface);

渲染纹理:使用SDL_RenderCopy(renderer, texture, NULL, &rect);

显示更新:调用SDL_RenderPresent(renderer);

代码

相关的pro文件

cpp 复制代码
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += \
        main.c

INCLUDEPATH += \
         $$PWD/../SDL2-2.0.10/include/

LIBS += \
 $$PWD/../SDL2-2.0.10/lib/x86/SDL2.lib

main.c文件

cpp 复制代码
#include <stdio.h>
#include <SDL.h>
#undef main

/*
 * 1:渲染器和纹理的关系 一个窗口可以有多个渲染器 然后一个渲染器可以渲染多个纹理
 */
int main() {
    int run = 1;
    // 窗口
    SDL_Window *window = NULL;
    // 渲染器
    SDL_Renderer *renderer = NULL;
    // 纹理
    SDL_Texture *texture = NULL;
    // 矩形
    SDL_Rect rect; // 长方形,原点在左上角
    rect.w = 50; // 方块大小
    rect.h = 50;

    SDL_Init(SDL_INIT_VIDEO); // 初始化函数,可以确定希望激活的子系统

    window = SDL_CreateWindow("2 Window",
                              SDL_WINDOWPOS_UNDEFINED,
                              SDL_WINDOWPOS_UNDEFINED,
                              640,
                              480,
                              SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_MOUSE_CAPTURE); // 创建窗口

    if (!window) {
        return -1;
    }
    renderer = SDL_CreateRenderer(window, -1, 0); // 基于窗口创建渲染器
    if (!renderer) {
        return -1;
    }

    texture = SDL_CreateTexture(renderer,
                                SDL_PIXELFORMAT_RGBA8888,
                                SDL_TEXTUREACCESS_TARGET,
                                640,
                                480); // 创建纹理

    if (!texture) {
        return -1;
    }

    int show_count = 0;
    while (run) {
        // 随机化矩形的位置
        rect.x = rand() % 600;
        rect.y = rand() % 400;
		/*,纹理(SDL_Texture)主要用于绘制内容的临时存储。
		代码中,渲染器先将内容绘制到纹理上,然后再将纹理整体拷贝到窗口。这种方式的好处包括:
		缓冲作用:将复杂的绘制操作先绘制在纹理上,减少直接操作窗口的次数,从而避免频繁刷新窗口带来的闪烁。
		灵活性:在不同渲染目标之间切换,便于处理半透明效果和动态效果,比如代码中的矩形随机位置刷新。*/
        SDL_SetRenderTarget(renderer, texture); // 设置渲染目标为纹理
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 127); // 绘制颜色设置为半透明红色,用于背景。
        SDL_RenderClear(renderer); // 用当前颜色清屏。

        SDL_RenderDrawRect(renderer, &rect); // 绘制矩形的边框。
        SDL_SetRenderDrawColor(renderer, 0, 255, 255, 255); // 将绘制颜色设置为白色(不透明)。
        /*在SDL中,调用SDL_RenderFillRect不仅会填充矩形,还会绘制其边框;
         * 因此,如果注释掉SDL_RenderFillRect,边框也不会显示。
         * SDL处理矩形时,如果仅调用SDL_RenderDrawRect绘制边框而不填充,边框可能不完整或不可见,尤其是在透明背景下。
         * 因此,如果需要边框效果,SDL_RenderFillRect或SDL_RenderDrawRect一起使用是常见的做法。
         */
        SDL_RenderFillRect(renderer, &rect); // 填充矩形

        SDL_SetRenderTarget(renderer, NULL); // 恢复默认,渲染目标为窗口 没用设置渲染目标的时候 渲染目标默认为当前窗口
        SDL_RenderCopy(renderer, texture, NULL, NULL); // 将纹理内容拷贝到窗口上。

        SDL_RenderPresent(renderer); // 刷新窗口,显示绘制的内容。
        SDL_Delay(500);
        if (show_count++ > 30) {
            run = 0; // 不跑了
        }
    }

    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window); // 销毁窗口
    SDL_Quit();
    return 0;
}
相关推荐
橘子味的茶二4 天前
SDL事件相关
sdl
橘子味的茶二4 天前
SDL线程
sdl
橘子味的茶二5 天前
SDL打开YUV视频
ffmpeg·音视频·sdl
布丁小站2 个月前
SDL录制音频并播放
音视频·sdl
程序员黄老师2 个月前
Windows下SDL2创建最简单的一个窗口
c++·windows·sdl·sdl2
程序员黄老师2 个月前
Windows与Linux下 SDL2的第一个窗口程序
c++·windows·ffmpeg·sdl
烈日下的奔跑3 个月前
SDL直接渲染yuv视频帧数据
ffmpeg·音视频·sdl
melonbo3 个月前
SDL 与 OpenGL 的关系
opengl·sdl
烈日下的奔跑3 个月前
SDL库自适应窗口大小及遇到的坑
ffmpeg·sdl