「SDL第二篇」窗口渲染

作者: 音视频直播技术专家 | 来源:发表于2018-04-07 23:43 被阅读118次

前言

上一篇文章中我们对SDL作了简单的介绍,重点介绍了如何编译SDL以及如何使用它。在文章的最后我们留下了一个疑问,即虽然我们创建了窗口,但窗口却并没有真正显示出来。

今天我们就来看一看,如何才能让创建的窗口真正的显示出来。

渲染的基本流程

为什么我们上一课中创建了窗口,但它却并没有显示出来呢?其原因是,我们创建的窗口只是逻辑上的窗口,要想让窗口显示出来,我们需要对窗口进行效果渲染,也就是要通过绘制像素的方法,将窗口中的像素全部点亮。

那么如何对窗口进行渲染呢?SDL为我们提供了方便是的API。不过在使用SDL对窗口进行渲染之前,我们要先了解渲染的基本原理。

其基本原理是,首先创建一个window窗口,它是我们要渲染的目标。然后,要有一个渲染上下文,该上下文中一方面存放着要渲染的目标,也就是windows窗口;另一方面是存放着一个缓冲区,该缓冲区用于存放渲染的内容。

渲染的内容可以是点、线、各种图形以及图片,视频的各种组合。这些组合后的内容首先被存放到缓冲区中,最终SDL将缓冲区中的内容渲染到窗口中。

所以渲染的基本流程如下:

  • 创建窗口
  • 创建渲染器
  • 清空缓冲区
  • 绘制要显示的内容
  • 最终将缓冲区内容渲染到window窗口上。

常用API

  • 创建渲染上下文

    SDL_Renderer* SDL_CreateRenderer(SDL_Window* window,
                                   int         index,
                                   Uint32      flags)
    

    window: 指明在哪个窗口里进行渲染
    index: 指定渲染驱动的索引号。一般指定为 -1.
    flags:

    flags 说明
    SDL_RENDERER_SOFTWARE the renderer is a software fallback
    SDL_RENDERER_ACCELERATED the renderer uses hardware acceleration
    SDL_RENDERER_PRESENTVSYNC present is synchronized with the refresh rate
    SDL_RENDERER_TARGETTEXTURE the renderer supports rendering to texture
  • 消毁渲染上下文

    释放渲染上下文相关的资源。

    void SDL_DestroyRenderer(SDL_Renderer* renderer)
    
  • 清空渲染目标

    该函数的作用是用指定的颜色清空缓冲区。

    int SDL_RenderClear(SDL_Renderer* renderer)
    

    renderer: 上面创建的渲染器上下文。

  • 展示要渲染的内容

    将缓冲区中的内容输出到目标上,也就是 windows 窗口上。

    void SDL_RenderPresent(SDL_Renderer* renderer)
    

    renderer: 上面创建的渲染器上下文

完整例子

我在第一课的代码上,添加了上面几个函数之后,大家可以看到一个全红色的窗口可以显示在我们的面前了。

当然我们还可以在上面画一些图形,比如使用 SDL_RenderDrawLines() 函数在窗口中画一条直线。

#include "SDL.h"
#include <stdio.h>

int main(int argc, char* argv[]) {

    int flag = 1;

    SDL_Window *window;                    // Declare a pointer
    SDL_Renderer *renderer;

    SDL_Init(SDL_INIT_VIDEO);              // Initialize SDL2

    // Create an application window with the following settings:
    window = SDL_CreateWindow(
        "An SDL2 window",                  // window title
        SDL_WINDOWPOS_UNDEFINED,           // initial x position
        SDL_WINDOWPOS_UNDEFINED,           // initial y position
        640,                               // width, in pixels
        480,                               // height, in pixels
        SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS// flags - see below
    );

    // Check that the window was successfully created
    if (window == NULL) {
        // In the case that the window could not be made...
        printf("Could not create window: %s\n", SDL_GetError());
        return 1;
    }

    /* We must call SDL_CreateRenderer in order for draw calls to affect this window. */
    renderer = SDL_CreateRenderer(window, -1, 0);

    /* Select the color for drawing. It is set to red here. */
    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);

    /* Clear the entire screen to our selected color. */
    SDL_RenderClear(renderer);

    /* Up until now everything was drawn behind the scenes.
       This will show the new, red contents of the window. */
    SDL_RenderPresent(renderer);

    // The window is open: could enter program loop here (see SDL_PollEvent())

    SDL_Delay(3000);  // Pause execution for 3000 milliseconds, for example

    //destory renderer
    if (renderer) {
        SDL_DestroyRenderer(renderer);
    }
    
    // Close and destroy the window
    SDL_DestroyWindow(window);

    // Clean up
    SDL_Quit();
    return 0;
}

小结

本文我向大家介绍了如何将创建的窗口展示出来,并重点介绍了窗口渲染的基本原理以及使用的 SDL API。

后面的文章我将向大家重点介绍如何在窗口绘制一些常用图形。

谢谢!

相关文章

  • 「SDL第二篇」窗口渲染

    前言 上一篇文章中我们对SDL作了简单的介绍,重点介绍了如何编译SDL以及如何使用它。在文章的最后我们留下了一个疑...

  • sdl 渲染窗口

    创建窗口实际上内存中分配了内存空间 我们真正要在我们显示器上显示 需要把内容推到显卡驱动上 显卡会通过驱动程序将它...

  • SDL渲染窗口

    SDL_Init/SDL_Quit() SDL_CreateWindow() / SDL_DestoryWindo...

  • SDL开发笔记(初级)

    SDL窗口渲染 SDL(Simple DirectMedia Layer) 由C语言实现的跨平台的媒体开源库 用于...

  • ffplay学习记录02

    使用SDL2.0在mac OS上渲染视频画面 SDL下载:使用 SDL 来渲染视频到屏幕。SDL 是 Simple...

  • SDL事件种类

    SDL_WindowEvent:窗口事件SDL_KeyboardEvent:键盘事件SDL_MouseMotion...

  • SDL显示YUV

    SDL显示YUV步骤 初始化SDL子系统 SDL_Init(SDL_INIT_VIDEO) 创建窗口 SDL_Cr...

  • SDL彻底理解纹理渲染

    SDL渲染基本原理 SDL纹理相关API 1、SDL_CreateTexture() format:YUV,RGB...

  • FFmpeg+SDL2实现音频流播放

    SDL2文章列表 SDL2入门 SDL2事件处理 SDL2纹理渲染 SDL2 PCM音频播放 FFmpeg+SDL...

  • 使用SDL显示YUV

    SDL 显示 YUV 流程: 1、初始化 Video 子系统;2、创建窗口;3、创建渲染上下文;4、创建纹理;5、...

网友评论

    本文标题:「SDL第二篇」窗口渲染

    本文链接:https://www.haomeiwen.com/subject/kgbuhftx.html