文章目录
渲染器 (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;
}