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;
}
运行效果:
SDL 开发实战(五): SDL 纹理渲染相关推荐
- [原创].NET 分布式架构开发实战五 Framework改进篇
原文:[原创].NET 分布式架构开发实战五 Framework改进篇 .NET 分布式架构开发实战五 Framework改进篇 前言:本来打算这篇文章来写DAL的重构的,现在计划有点改变.之前的文章 ...
- SDL 开发实战(四): SDL 事件处理
在前面学习SDL的例子运行时,我们发现我们的窗口只停留了几秒,但是如果设置更长时间显然也有其他的弊端. 那么有没有一种好的办法可以解决这个问题呢?例如:能不能让窗口一直显示,直到检测到用户用鼠标点击关 ...
- 从0到1使用VUE-CLI3开发实战(五):模块化VUEX及使用vuetify
小肆前几天发了一篇2019年Vue精品开源项目库的汇总,今天小肆要使用的是在UI组件中排行第三的Vuetify. vuetify介绍 Vuetify是一个渐进式的框架,完全根据Material Des ...
- SDL 开发实战(二):SDL 2.0 核心 API 解析
基本的SDL的使用思路,基本分为三部分:初始化 -> 循环渲染 -> 销毁释放资源. SDL 初始化相关方法 : SDL_Init(): 初始化SDL SDL_CreateWindow() ...
- SDL 开发实战(三):使用 SDL 绘制基本图形
本文我们来讲一下,如何使用SDL的API绘制基本的图形. SDL中绘制基本图形的 API并不多,主要是 点.线.矩形.填充矩形.其它图形都可以通过 点.线.矩形组合出来. 1. 设置画笔的颜色 设置画 ...
- SDL 开发实战(一):SDL介绍
一.什么是SDL? SDL是 "Simple DirectMedia Layer"的缩写,SDL是一个开源的跨平台的多媒体库,封装了复杂的音视频底层操作,简化了音视频处理的难度. ...
- CrazyWing:Python自动化运维开发实战 五、Python运算符与表达式
导语: 1.什么是运算符 2.什么是表达式 3.python运算符分类 4.python运算符优先级 什么是运算符: 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操 ...
- VUE+Spring Boot前后端分离开发实战(五):基于shiro鉴权的角色增删改查(CURD)-封装分页组件和所有增删改查模块化
文章目录 前言 后端实现 前端实现 分页组件封装 增删改查模块化 角色管理页面 实现效果 前言 本文在上文基础上把查询.增加.修改以及删除的请求封装在table.js中,实现了所有用到增删改查页面代码 ...
- SDL开发(一):SDL简介及2.0核心API解析
文章目录 零. 参考文献 一. 什么是SDL? 1. SDL 库分类 2. SDL 子系统分类 二. SDL2.0核心API解析 1. 初始化函数 SDL_Init() 2. 创建窗口 SDL_Cre ...
最新文章
- hdu4965 巧用矩阵乘法结合律
- StarlingMVC Framework 原理。。。
- SQL Server 的锁定和阻塞
- JavaScript的类型、值和变量
- 【转】匈牙利算法理解
- Spring Boot 常见面试题
- springboot 常用配置之多环境配置(开发环境、测试环境、生产环境等)
- Teams中的快捷键让沟通协作更加高效
- VS2017 启动调试报错无法启动程序 当前状态中非法
- [转]IT开发工程师的悲哀
- 六、访问CGI变量 (基础教程6)
- set是无序集合,放入set中的元素通过iterator输出时候是无序的
- python-fire的使用
- 【Notepad】Notepad++常用快捷键总结
- 安全架构--5--SDL安全与企业办公安全落地实践
- 中国首款前装L3自动驾驶卡车发布:一汽解放制造,京东车队运营
- 电子计算机的加减乘除叫做什么,计算机中加减乘除叫什么键
- (26)盘古自研框架BackPropagation
- 气象卫星_全国自动站资料文件名规定(1)
- 海拔高度对电子产品性能的影响及要求
热门文章
- mysql 整型时间戳_整型unix时间戳
- Ubuntu 16.04安装 微信
- vue.js入门 1.v-for中in与of的区别:
- http://wenku.baidu.com/link?url=aQUY1JswPwgulwBoaIt8GZAEjdUHhebtWmo7bqTQUJrO_fn16YWCoAtRTHhRQ8Bzx3qR
- golang---锁
- [转]物联网之父凯文· 艾希顿演讲PPT:物联网与智慧城市
- K8S 微服务 —— misc
- 常见面试问题-自我介绍、离职原因、期望薪资…(含面试答案)
- 迪赛智慧数——柱状图(正负条形图):2022届毕业生不同城市的期望实际薪资
- Cisco思科三层交换机配置DHCP服务