zoukankan      html  css  js  c++  java
  • SDL 开发实战(五): SDL 纹理渲染

    本文我们讲一下如何使用SDL_Texture将视频纹理渲染出来。

    1. SDL 视频渲染相关对象

    SDL 视频渲染主要涉及到四个对象:SDL_Window、SDL_Render、SDL_Texture和SDL_Surface。

    SDL_Window代表的是窗口的逻辑概念,它是存放在主内存中的一个对象。当我们调用SDL API 创建窗口后,它并不会被显示出来。

    SDL_Render 是渲染器,它也是主存中的一个对象。对Render操作时实际上分为两个阶段:

    • 渲染阶段。在该阶段,用户可以画各种图形渲染到SDL_Surface或SDL_Texture 中;
    • 显示阶段。参SDL_Texture为数据,通过OpenGL操作GPU,最终将 SDL_Surfce 或SDL_Texture中的数据输出到显示器上。

    SDL_Render对象中有一个视频缓冲区,该缓冲区我们称之为SDL_Surface,它是按照像素存放图像的。我们一般把真彩色的像素称为RGB24数据。也就是说,每一个像素由24位组成,每8位代表一种颜色,像素的最终颜色是由RGB三种颜色混合而成的。

    SDL_Texture 与SDL_Surface 相似,也是一种缓冲区。只不过它存放的不是真正的像素数据,而是存放的图像的描述信息。这些描述信息通过OpenGL、D3D 或 Metal等技术操作GPU,从而绘制出与SDL_Surface一样的图形,且效率更高。

    2. 使用 SDL_Texute 渲染纹理的步骤

    SDL提供了操作SDL_Texture的方法,使用SDL_Texute的基本步骤为:

    • 创建一个 SDL_Texture。

    • 渲染 Texture

    • Destory Texture

    3. 使用SDL渲染纹理的核心API

    a). 创建 SDL_Texture

    SDL_Texture* SDL_CreateTexture(SDL_Renderer* renderer,  // 渲染器
                           Uint32        format,            // 渲染数据的格式,如YUV、RGB     
                           int           access,            // Texture 类型,target、stream 
                           int           w,                
                           int           h)

    下面说明一下重要参数:

    format: 指明像素格式,可以是YUV,也可以是RGB

    access: 指明Texture的类型。可以是 Stream(视频),也可以是Target一般的类型。

    b). 渲染

    int SDL_RenderCopy(SDL_Renderer* renderer,
                   SDL_Texture*    texture,
                   const SDL_Rect* srcrect,
                   const SDL_Rect* dstrect)

    下面说明一下重要参数:

    srcrect: 指定 Texture 中要渲染的一部分。如果将 Texture全部输出,可以设置它为 NULL。

    dstrect: 指定输出的空间大小。

    c). 销毁 SDL_Texture

    void SDL_DestroyTexture(SDL_Texture* texture)

    纹理渲染实战:

    // SDL.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include "pch.h"
    #include <iostream>
    
    extern "C" {
    #include "SDL.h"
    }
    
    int main(int argc, char* argv[])
    {
        SDL_Window *window;
        SDL_Renderer *renderer;
        SDL_Texture *texture;
        SDL_Event event;
        SDL_Rect r;
    
        if (SDL_Init(SDL_INIT_VIDEO) < 0) {
            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s", SDL_GetError());
            return 3;
        }
    
        window = SDL_CreateWindow("SDL_CreateTexture",
            SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED,
            1024, 768,
            SDL_WINDOW_RESIZABLE);
    
        r.w = 100;
        r.h = 50;
    
        renderer = SDL_CreateRenderer(window, -1, 0);
    
        texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 1024, 768);
    
        // 跳来跳去的方块
        while (1) {
            SDL_PollEvent(&event);
            if (event.type == SDL_QUIT)
                break;
            r.x = rand() % 500;
            r.y = rand() % 500;
    
            SDL_SetRenderTarget(renderer, texture);
            SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
            SDL_RenderClear(renderer);
            SDL_RenderDrawRect(renderer, &r);
            SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0x00);
            SDL_RenderFillRect(renderer, &r);
            SDL_SetRenderTarget(renderer, NULL);
            SDL_RenderCopy(renderer, texture, NULL, NULL);
            SDL_RenderPresent(renderer);
        }
        SDL_DestroyRenderer(renderer);
        SDL_Quit();
        return 0;
    }

    运行效果:

  • 相关阅读:
    【 React
    vue : 无法加载文件 C:UsersXXXAppDataRoaming pmvue.ps1,因为在此系统上禁止运行脚本
    web前端工程化
    node.js读写文件
    gulp简单使用
    在window里面安装ubuntu子系统并安装图形化界面
    节点操作--JavaScript
    【jQuery中css(),attr()和prop区别】
    【animation和transtion】
    【网络状态反馈码】
  • 原文地址:https://www.cnblogs.com/renhui/p/10466773.html
Copyright © 2011-2022 走看看