SDL_Texture

SDL_Texture是计算机图形图像中,如何在屏幕上显示图像的一个数据的抽象。中文也已翻译为纹理。这种概念在OpenGL中也有出现。对于SDL_Texture本身来说,它包含了显示驱动用于显示的特定数据结构。

SDL_Texture的创建一半通过SDL_CreateTexture创建,创建一次后,可以重复使用,通过SDL_UpdateTexture函数更新数据。

SDL_CreateTexture

函数原型:

SDL_Texture* SDL_CreateTexture(SDL_Renderer* renderer,Uint32        format,int           access,int           w,int           h)

函数功能:使用此函数可为渲染器上下文创建纹理。

参数列表

参数 释义
renderer 渲染器上下文
format 渲染的像素格式,支持的格式,在 SDL_PixelFormatEnum中,详情见渲染器支持的像素格式
access 纹理访问模式,定义在 SDL_TextureAccess中; 详见纹理访问模式
w 纹理的宽度(以像素为单位)
h 纹理的高度(以像素为单位)

返回值:返回渲染器上下文的纹理。

渲染器支持的像素格式:

SDL_PIXELFORMAT_UNKNOWN
SDL_PIXELFORMAT_RGB332
SDL_PIXELFORMAT_RGB444
SDL_PIXELFORMAT_RGB555
SDL_PIXELFORMAT_ARGB1555
SDL_PIXELFORMAT_RGBA5551
SDL_PIXELFORMAT_ABGR1555
SDL_PIXELFORMAT_BGRA5551
SDL_PIXELFORMAT_RGB565
SDL_PIXELFORMAT_RGBA32 当前平台的RGBA字节数组颜色的别名(>= SDL 2.0.5)
SDL_PIXELFORMAT_ARGB32 当前平台的ARGB字节数组颜色数据的别名(>= SDL 2.0.5)
SDL_PIXELFORMAT_YV12 平面模式: Y + V + U (3 planes)
SDL_PIXELFORMAT_IYUV 平面模式: Y + U + V (3 planes)
SDL_PIXELFORMAT_YUY2 打包模式: Y0+U0+Y1+V0 (1 plane)
SDL_PIXELFORMAT_UYVY 打包模式: U0+Y0+V0+Y1 (1 plane)
SDL_PIXELFORMAT_YVYU 打包模式: Y0+V0+Y1+U0 (1 plane)
SDL_PIXELFORMAT_NV12 打包模式: Y + U/V 交错 (2 planes) (>= SDL 2.0.4)
SDL_PIXELFORMAT_NV21 打包模式: Y + V/U 交错 (2 planes) (>= SDL 2.0.4)

纹理访问模式

访问模式 含义
SDL_TEXTUREACCESS_STATIC 变化很少,不可锁定
SDL_TEXTUREACCESS_STREAMING 经常变化,可锁定
SDL_TEXTUREACCESS_TARGET 可以用作渲染目标

SDL_UpdateTexture

函数原型:

int SDL_UpdateTexture(SDL_Texture*    texture,const SDL_Rect* rect,const void*     pixels,int             pitch)

函数功能:使用新的像素数据更新给定的纹理矩形。也就是说,可以固定刷新纹理的某一分部区域。

参数列表

参数 含义
texture the texture to update
rect 用SDL_Rect结构表达纹理中需要更新数据的区域, 如果为NULL则更新整个纹理
pixels 纹理格式的原始像素数据,格式通常在创建纹理的函数中指定
pitch 一行像素数据中的字节数,包括行之间的填充。字节数通常由纹理的格式决定

这里需要解释一下pitch的计算方式,以一帧尺寸为960x540,格式为SDL_PIXELFORMAT_IYUV为例,计算

pitch :

SDL_PIXELFORMAT_IYUV,也就是IYUV类型,也称为YUV420p、I420,它在内存中的存储格式为三平面存储。

即:第一个平面960个字节的位置存Y分量,第二个平面480个字节存U分量,第三个平面480个字节存V分量。而这个函数中的pitch所说的一行数像素数据中的字节数,其实指的是第一个平面的长度(字节为单位),也就是960字节,虽然和宽度在数学上相等,但它们所表达的意思是不一样的,

另外,这是一个相当慢的函数,旨在用于不经常更改的静态纹理。

如果要经常更新纹理,则最好将纹理创建为流式传输并使用下面SDL_LockTexture锁定函数。 虽然此功能适用于流式纹理,但出于优化原因,如果之后锁定纹理,则可能无法获得像素。

SDL_LockTexture:锁定纹理

SDL_UnlockTexture:解锁纹理

返回值

成功时返回0或失败时返回负错误代码

#include <iostream>#include <SDL.h>
#include <SDL2/SDL_image.h>using namespace  std;const int WIDTH = 960, HEIGHT = 540;
int main() {if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {cout << "SDL could not initialized with error: " << SDL_GetError() << endl;return -1;}SDL_Window *window = SDL_CreateWindow("Hello SDL world!", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,WIDTH, HEIGHT, SDL_WINDOW_ALLOW_HIGHDPI);if (NULL == window) {cout << "SDL could not create window with error: " << SDL_GetError() << endl;return -1;}if (!(IMG_Init(IMG_INIT_JPG) & IMG_INIT_JPG)) {cout << "SDL_image could not init with error: " << IMG_GetError() << endl;return -1;}FILE* pFile = fopen("little_prince_i420_960x540.yuv", "rb");if (pFile == NULL) {cerr << "little_prince_i420_960x540.yuv open failed" << endl;}unsigned char *m_yuv_data;int frameSize = HEIGHT * WIDTH * 12 / 8;m_yuv_data = (unsigned char*)malloc(frameSize * sizeof(unsigned char));fread(m_yuv_data, 1, frameSize, pFile);fclose(pFile);SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0); // 创建渲染器// 创建纹理SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV,  SDL_TEXTUREACCESS_STREAMING, WIDTH, HEIGHT);if (texture != NULL) {SDL_Event windowEvent;while (true) {if (SDL_PollEvent(&windowEvent)) {if (SDL_QUIT == windowEvent.type) {cout << "SDL quit!!" << endl;break;}}SDL_UpdateTexture(texture, NULL, m_yuv_data, WIDTH); // 更新纹理SDL_RenderClear(renderer); // 清除渲染器SDL_RenderCopy(renderer, texture, NULL, NULL); // 拷贝纹理到渲染器SDL_RenderPresent(renderer); // 渲染}SDL_DestroyTexture(texture);SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);SDL_Quit();return 0;}
}

SDL2常用函数结构分析:SDL_TextureSDL_CreateTextureSDL_UpdateTexture相关推荐

  1. VC API常用函数

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄, 这个函数的定义是这样的 HWND WINAPI FindWindow(LPCSTR lpClassName ...

  2. php内置常用函数是哪些,PHP常用函数有哪些

    PHP常用函数有哪些 导语:PHP主要通过函数实现一些功能,那PHP常用函数有哪些呢?下面就由小编为大家介绍一下,欢迎大家阅读! 数学函数 1.abs(): 求绝对值 $abs = abs(-4.2) ...

  3. Lua基本语法-书写规范以及自带常用函数

    Lua基本语法-书写规范和常用函数 本文提供全流程,中文翻译. Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 String O ...

  4. SQLserver 常用函数适用方法(转载)

    SQL Server 常用函数使用方法(持续更新) 之前就想要把一些 SQL 的常用函数记录下来,不过一直没有实行...嘿嘿... 直到今天用到substring()这个函数,C# 里面这个方法起始值 ...

  5. python Pool常用函数用法总结

    在本篇内容里小编给大家整理的是一篇关于python Pool常用函数用法总结内容,有需要的朋友们可以学习下. 1.说明 apply_async(func[,args[,kwds]):使用非堵塞调用fu ...

  6. ACM——常用函数总结

    常用函数总结: 一.全排列:next_permutation 二.读写优化 三.返回容器内最大最小值 四.复制函数 五.容器删除函数 六.容器填充函数 七.查找函数 八.字符串转换整数 九.欧拉筛 十 ...

  7. e class connect.php,剖析帝国CMS核心文件e/class/connect.php中的常用函数

    帝国CMS下的e/class/connect.php文件中包含了帝国CMS常用的一些核心功能函数,加深对connect.php文件中常用函数的了解对于帝国CMS的二次开发来说非常重要. 现将帝国CMS ...

  8. PHP访问mysql的常用函数,PHP操作MySQL数据库常用函数

    PHP操作MySQL数据库常用函数 php操作mysql数据库,俗称天龙八步: 第一步:连接数据库 第二步:判断连接错误 第三步:选择数据库 第四步:设置字符集 第五步:准备SQL语句 第六步:执行并 ...

  9. python math库常用函数_Python math库常用函数

    math库常用函数及举例: 注意:使用math库前,用import导入该库 >>> import math 取大于等于x的最小的整数值,如果x是一个整数,则返回x >>& ...

最新文章

  1. [ActionScript 3.0] AS向php发送二进制数据方法之——在URLRequest中构造HTTP协议发送数据...
  2. 【转】用示例说明索引数据块中出现热块的场景,并给出解决方案
  3. PetShop之ASP.NET缓存
  4. CentOS编译安装php扩展gd
  5. 大数据学习(07)--MapReduce
  6. 数字0-9的数量(51Nod-1042)
  7. fastdfs暗转 linux_Linux下安装fastDFS
  8. 转一篇矩阵方面有趣的文章
  9. linux下安装apache + subversionSVN_Subversion
  10. c语言控制台不退出程序,怎样可以屏蔽控制台程序的关闭按钮
  11. SQL variable type
  12. nanomsg的协议
  13. win10专业版激活工具很不错!
  14. 鸿蒙之境浩然溟涬,列子 简历 - 名人简历
  15. 港股交易最大手数是如何规定的?
  16. 图像算法工程师面试考点集锦
  17. 十个常见常用的麦克劳林公式
  18. 第一部分:基础篇(一)
  19. c语言c 一元二次方程,如何用C语言来计算一元二次方程
  20. 浅析在线教育行业发展所面临的困境

热门文章

  1. 接入华为联运 / 小米联运 怎么测?
  2. iphone跬步之--NSString
  3. sl软件安装方式总结
  4. 专科程序员“霸面”蚂蚁金服,4轮面试,竟拿下offer(Java方向)
  5. 微信小程序校园学生选课教学论坛信息管理系统SSM-JAVA【数据库设计、论文、源码、开题报告】
  6. 服务器运维系统哪个好用,可以说宝塔是史上最好用的服务器运维控制面板
  7. GEEer成长日记十七:在Google Earth Engine(GEE)中批量下载MODIS NDVI数据
  8. 【北亚数据恢复案例】raid0硬盘故障导致服务器崩溃的数据恢复
  9. iOS:创建撒花动画
  10. 转行自学软件测试没后悔,我的经历证明,改变永远没有错