本文我们讲一下如何使用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;
}

运行效果:

SDL 开发实战(五): SDL 纹理渲染相关推荐

  1. [原创].NET 分布式架构开发实战五 Framework改进篇

    原文:[原创].NET 分布式架构开发实战五 Framework改进篇 .NET 分布式架构开发实战五 Framework改进篇 前言:本来打算这篇文章来写DAL的重构的,现在计划有点改变.之前的文章 ...

  2. SDL 开发实战(四): SDL 事件处理

    在前面学习SDL的例子运行时,我们发现我们的窗口只停留了几秒,但是如果设置更长时间显然也有其他的弊端. 那么有没有一种好的办法可以解决这个问题呢?例如:能不能让窗口一直显示,直到检测到用户用鼠标点击关 ...

  3. 从0到1使用VUE-CLI3开发实战(五):模块化VUEX及使用vuetify

    小肆前几天发了一篇2019年Vue精品开源项目库的汇总,今天小肆要使用的是在UI组件中排行第三的Vuetify. vuetify介绍 Vuetify是一个渐进式的框架,完全根据Material Des ...

  4. SDL 开发实战(二):SDL 2.0 核心 API 解析

    基本的SDL的使用思路,基本分为三部分:初始化 -> 循环渲染 -> 销毁释放资源. SDL 初始化相关方法 : SDL_Init(): 初始化SDL SDL_CreateWindow() ...

  5. SDL 开发实战(三):使用 SDL 绘制基本图形

    本文我们来讲一下,如何使用SDL的API绘制基本的图形. SDL中绘制基本图形的 API并不多,主要是 点.线.矩形.填充矩形.其它图形都可以通过 点.线.矩形组合出来. 1. 设置画笔的颜色 设置画 ...

  6. SDL 开发实战(一):SDL介绍

    一.什么是SDL? SDL是 "Simple DirectMedia Layer"的缩写,SDL是一个开源的跨平台的多媒体库,封装了复杂的音视频底层操作,简化了音视频处理的难度. ...

  7. CrazyWing:Python自动化运维开发实战 五、Python运算符与表达式

    导语: 1.什么是运算符 2.什么是表达式 3.python运算符分类 4.python运算符优先级 什么是运算符: 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操 ...

  8. VUE+Spring Boot前后端分离开发实战(五):基于shiro鉴权的角色增删改查(CURD)-封装分页组件和所有增删改查模块化

    文章目录 前言 后端实现 前端实现 分页组件封装 增删改查模块化 角色管理页面 实现效果 前言 本文在上文基础上把查询.增加.修改以及删除的请求封装在table.js中,实现了所有用到增删改查页面代码 ...

  9. SDL开发(一):SDL简介及2.0核心API解析

    文章目录 零. 参考文献 一. 什么是SDL? 1. SDL 库分类 2. SDL 子系统分类 二. SDL2.0核心API解析 1. 初始化函数 SDL_Init() 2. 创建窗口 SDL_Cre ...

最新文章

  1. hdu4965 巧用矩阵乘法结合律
  2. StarlingMVC Framework 原理。。。
  3. SQL Server 的锁定和阻塞
  4. JavaScript的类型、值和变量
  5. 【转】匈牙利算法理解
  6. Spring Boot 常见面试题
  7. springboot 常用配置之多环境配置(开发环境、测试环境、生产环境等)
  8. Teams中的快捷键让沟通协作更加高效
  9. VS2017 启动调试报错无法启动程序 当前状态中非法
  10. [转]IT开发工程师的悲哀
  11. 六、访问CGI变量 (基础教程6)
  12. set是无序集合,放入set中的元素通过iterator输出时候是无序的
  13. python-fire的使用
  14. 【Notepad】Notepad++常用快捷键总结
  15. 安全架构--5--SDL安全与企业办公安全落地实践
  16. 中国首款前装L3自动驾驶卡车发布:一汽解放制造,京东车队运营
  17. 电子计算机的加减乘除叫做什么,计算机中加减乘除叫什么键
  18. (26)盘古自研框架BackPropagation
  19. 气象卫星_全国自动站资料文件名规定(1)
  20. 海拔高度对电子产品性能的影响及要求

热门文章

  1. mysql 整型时间戳_整型unix时间戳
  2. Ubuntu 16.04安装 微信
  3. vue.js入门 1.v-for中in与of的区别:
  4. http://wenku.baidu.com/link?url=aQUY1JswPwgulwBoaIt8GZAEjdUHhebtWmo7bqTQUJrO_fn16YWCoAtRTHhRQ8Bzx3qR
  5. golang---锁
  6. [转]物联网之父凯文· 艾希顿演讲PPT:物联网与智慧城市
  7. K8S 微服务 —— misc
  8. 常见面试问题-自我介绍、离职原因、期望薪资…(含面试答案)
  9. 迪赛智慧数——柱状图(正负条形图):2022届毕业生不同城市的期望实际薪资
  10. Cisco思科三层交换机配置DHCP服务