音视频开发_SDL彻底理解纹理

这是SDL系列文章的第五篇,本文将彻底让你理解什么是纹理。并带你深入探讨SDL的几个重要概念SDL_Window、SDL_Render、SDL_Surface 与 SDL_Texture。在文章的最后向你展示SDL如何通过SDL_Texture进行渲染。

对于前面系列文章感兴趣的同学可以搜索查看:

  • SDL 入门
  • SDL窗口渲染
  • SDL基本图形绘制
  • SDL事件处事

SDL_Surface vs SDL_Texture

在SDL系列文章的第二篇里,我详细的介绍了SDL 渲染的工作原理。即在SDL_Render对象中有一个视频缓冲区,该缓冲区我们称之为SDL_Surface,它是按照像素存放图像的。我们一般把真彩色的像素称为RGB24数据。也就是说,每一个像素由24位组成,每8位代表一种颜色,像素的最终颜色是由RGB三种颜色混合而成的。

SDL_Texture 与SDL_Surface相似,也是一种缓冲区。只不过它存放的不是真正的像素数据,而是存放的图像的描述信息。当渲染纹理时,SDL以这些描述信息为数据,底层通过OpenGL、D3D 或 Metal操作GPU,最终绘制出与SDL_Surface一样的图形,且效率更高(因为它是GPU硬件计算的)。

看了以上的介绍,是不是对纹理有了一个清楚的认识了?

介绍完 SDL_Surface 和 SDL_Texture后,我们再看下SDL_Window 与 SDL_Render。

SDL_Window 与 SDL_Render

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

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

一、渲染阶段。在该阶段,用户可以画各种图形渲染到SDL_Surface或SDL_Texture 中;

二、显示阶段。参SDL_Texture为数据,通过OpenGL操作GPU,最终将 SDL_Surfce 或SDL_Texture中的数据输出到显示器上。

通过上面的介绍,我们就将 SDL_Window、SDL_Render、SDL_Surface与 SDL_Texture之间的关系梳理清楚了,下面我们来看一下如何使用 SDL_Texture。

使用SDL_Texture

SDL提供了非常好用的操作SDL_Texture的方法,下面我们来重点介绍一下使用SDL_Texute的基本步骤。

  • 创建一个 SDL_Texture。
  • 渲染 Texture
  • Destory Texture

API详细介绍

  • 创建 SDL_Texture
SDL_Texture* SDL_CreateTexture(SDL_Renderer* renderer,
                             Uint32        format,
                             int           access,
                             int           w,
                             int           h)
  • format: 指明像素格式,可以是YUV,也可以是RGB
  • access: 指明Texture的类型。可以是 Stream(视频),也可以是Target一般的类型。

渲染

int SDL_RenderCopy(SDL_Renderer*   renderer,
                 SDL_Texture*    texture,
                 const SDL_Rect* srcrect,
                 const SDL_Rect* dstrect)
  • srcrect: 指定 Texture 中要渲染的一部分。如果将 Texture全部输出,可以设置它为 NULL。
  • dstrect: 指定输出的空间大小。

销毁Texture

void SDL_DestroyTexture(SDL_Texture* texture)

例子

下面这个例子非常简单,我这里就不做特别的说明了。对这个程序看不懂的同学可以看我之前的几篇 SDL 的相关文章。

#include "SDL.h"

/* Moving Rectangle */
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;
}

小结

本文重点介绍了 SDL_Window、SDL_Render、SDL_Surface以及SDL_Texture之间的关系。搞清楚它们之前的关系对于理解 SDL 渲染起着至关重要的作用。

大家一定要仔细的理解文章中所讲的内容,在我后序的文章中,尤其是后面介绍 播放器 相关内容时,都要用到现在所讲的这些内容。

粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库,具有简单易用的API,能在不同平台(Windows、Linux、Mac OS X等)上实现多媒体相关的软件开发。SDL提供音频、视频、2D图形、事件等处理功能,可以用于游戏开发,媒体播放、图形用户界面应用等。 SDL播放视频,需要使用相关的库函数。首先,需要使用SDL_Init()函数来初始化SDL库,然后使用SDL_CreateWindow()函数创建一个窗口,接着使用SDL_CreateRenderer()函数创建渲染器。这些操作完成后,使用SDL_CreateTextureFromSurface()函数将视频文件载入内存作为纹理(texture)使用,然后使用SDL_RenderCopy()函数将纹理渲染到窗口上。最后,使用SDL_RenderPresent()函数将渲染结果显示出来。如果需要播放声音,还需要使用SDL_AudioSpec结构体进行相关设置。 需要注意的是,不同的平台可能支持的视频编码格式不同,需要根据具体情况进行设置。此外,视频播放的帧率、大小等也需要根据实际需要进行调整。 总体而言,SDL播放视频是一个相对简单的操作,具有跨平台的优势,可以为多媒体软件开发提供方便。但是,需要一定的编程经验和SDL库的相关知识才能够进行操作。 ### 回答2: SDL是一款跨平台的多媒体开发库,可以用来播放视频。要使用SDL播放视频,首先需要配置好SDL运行环境,将SDL库与开发环境进行链接。 在开始播放视频前,需要加载视频文件。可以使用SDL提供的函数SDL_LoadBMP()来加载一个BMP格式的视频文件,也可以使用其他支持的格式如MP4等。加载视频文件后,可以通过SDL_Surface来获取视频的像素数据。 接下来,需要创建一个SDL_Window来展示视频播放界面,可以使用SDL_CreateWindow()函数来创建一个窗口。然后,使用SDL_CreateRenderer()函数创建一个渲染器,将视频内容渲染至窗口上。 为了实现视频的播放,需要在一个循环中不断地渲染视频帧。可以利用SDL提供的函数SDL_RenderCopy()将视频的像素数据复制到渲染器上,然后使用SDL_RenderPresent()函数将渲染器的内容显示到窗口上。 在循环中,可以通过SDL_PollEvent()函数获取用户的输入事件,比如按键或鼠标点击等,以便进行相关的操作,如暂停视频、调节音量等。 当视频播放结束或用户关闭窗口时,需要释放相关的资源。可以使用SDL_FreeSurface()函数释放视频的像素数据,使用SDL_DestroyRenderer()函数销毁渲染器,使用SDL_DestroyWindow()函数关闭窗口。 总结来说,通过SDL库,我们可以加载视频文件,创建窗口和渲染器,实现视频的播放功能。同时,还可以通过SDL的其他函数来进行视频的控制和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值