当前位置: 首页 > article >正文

SDL渲染器和纹理

文章目录

      • 渲染器 (SDL_Renderer)
      • 纹理 (SDL_Texture)
      • 代码

渲染器 (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文件

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文件

#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;
}


http://www.kler.cn/a/389029.html

相关文章:

  • 三正科技笔试题
  • Unity3D学习FPS游戏(12)敌人检测和攻击玩家
  • 使用 start-local 脚本在本地运行 Elasticsearch
  • C++单例模式实现
  • TensorRT基础知识
  • MySQL:CRUD
  • 2024-11-10-leetcode每日一题-540. 有序数组中的单一元素
  • Python数据分析-Google Play商店应用数据分析
  • C#里对数组的排序操作
  • 关于我重生到21世纪学C语言这件事——函数详解
  • 初始JavaEE篇——多线程(8):JUC的组件
  • Python 获取PDF的各种页面信息(页数、页面尺寸、旋转角度、页面方向等)
  • jupyter添加、删除、查看内核
  • 一篇Spring Boot 笔记
  • Python | Leetcode Python题解之第542题01矩阵
  • 【Ubuntu20】VSCode Python代码规范工具配置 Pylint + Black + MyPy + isort
  • 微信小程序运营日记(第四天)
  • 16.UE5拉怪机制,怪物攻击玩家,伤害源,修复原视频中的BUG
  • VAE的原理及MNIST数据生成
  • 【计算机网络】基础知识,常识应用知识
  • Webpack知识点—publicPath
  • JVM 进阶:深入理解与高级调优
  • YOLOv6-4.0部分代码阅读笔记-engine.py
  • Skyeye 云智能制造 v3.14.12 发布,ERP + 商城
  • 【AI技术】PaddleSpeech部署方案
  • Python实现SSA智能麻雀搜索算法优化BP神经网络分类模型(优化权重和阈值)项目实战