显示器如何显示一个YUV422格式的图形
记录在开发过程中对知识点的一些理解:
在开发渲染程序的过程中,需要对视屏文件进行解码解码后特效文件的叠加,使用的技术是(FFmpeg+DirectX)
解码出来的视屏数据格式是YUYV,使用DirectX的创建的纹理格式为RGBA,
(1):视屏的宽高分别为Width和Height,则视屏最后在显卡中显示为RGBA的缓存大小:Width*4*Height。
(2):FFmpeg解码为YUYV格式的缓存大小为:Width*2*Height,因为每个像素采样一个Y,每两个像素采样一个UV。那么则创建一个宽度为Width*2,高度为Height的DirectX纹理来存储解码后的YUYV数据,将此数据送入定点作色器和像素作色器进行采样。其大概流程为:
解码后的YUYV数据 -> DirectX纹理数据 -> 作色器采样(还原为2倍大小)-> 显示器输出显示

YUYV数据和RGBA纹理中的数据完全一样,都是YUYVYUYVYUYV……的格式和大小,并没有带有真正的透明度信息(即YUYV分别对应RGBA,其实A存储的为V信息),数据只有在进行采样的时候送入顶点和像素作色器才被还原为原来的大小,在作色器中才有数据格式的变化,将YUV转化为RGB,然后给A的透明度填充为固定值,不透明。
(3):下面来分析采样的方式:

目的:将一个宽度只有显示一半的纹理数据(YUYV)完整的显示在显示器上,即将一个大小为【W/2 * H】的YUV/RGBA纹理变化为一个大小为【w * H】的RGBA数据,并且显示在显示器上面
分析:如何将一个大小不等于显示屏宽度的图像全屏完整的显示出来呢?答案是:在横向和纵向进行屏幕显示分辨率的宽度个数次采样,假如屏幕的分辨率是1920*1080,则将要显示的图像进行横向1920次采样,纵向1080次采样。
则for(int i = 0;i<1080;i++)
{
for(int j = 0; j< 1920; j++)
{
//Samplate 对需要输出的原始图形进行采样,则每次采样的位置为(src.i/1920*src.w)
//假如原图像的宽高为960*1080,则第一次C采样的点位(0,0),第二次采样的地位(0,0),第三次(1.0),第四次(1.0)
//则纹理坐标为(0/960,0/1080)映射到(0/1920,0/1080)
//则纹理坐标为(0/960,0/1080)映射到(1/1920,0/1080)
//则纹理坐标为(1/960,0/1080)映射到(2/1920,0/1080)
//则纹理坐标为(1/960,0/1080)映射到(3/1920,0/1080)
}
}
如下图所示:
其实作色器会在原始图像中每个像素采样两次;每次采样的纹理坐标为(i/1920,j),i为的范围是【0-960】

显示器如何显示一个YUV422格式的图形的更多相关文章
- toString和valueOf使得对象访问时显示一个特定格式的字符串,但是可以进行数字运算
作用 toString()的作用是返回一个反映这个对象的字符串; valueOf()的作用是返回它相应的原始值; 异同点 共同点:在 JavaScript 中,toString()方法和valueOf ...
- Java如何以(MMM)格式显示一个月份的名称?
JAVA中,如何以(MMM)格式显示一个月份的名称? 此示例显示如何使用Calender类的Calender.getInstance()方法和Formatter类的fmt.format()方法来显示( ...
- js获取上一个月、下一个月格式为yyyy-mm-dd的日期
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...
- POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取
第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个 ...
- Ubuntu 12.04更换显示器后显示“显示不支援”,只能进恢复模式工作
以前用的一台14寸液晶,换成17寸后,进入系统显示器上“显示不支援” .仔细观查,电脑硬盘自检能显示后,后面都是黑屏. 解决过程. 因为grub 启动菜单不能显示.盲按方向键,发现菜单里的其它项目可 ...
- OpenGL编程逐步深入(二)在窗口中显示一个点
准备知识 在本文中我们将会接触到OpenGl的扩展库GLEW( OpenGL Extension Wrangler Library),GLEW可以帮助我们处理OpenGl中繁琐的扩展管理.一旦初始化后 ...
- osgEarth使用笔记1——显示一个数字地球
目录 1. 概述 2. 实现 2.1. 三维显示 2.2. 二维显示 1. 概述 osgEarth支持.earth格式的文件,里面保存了数字地球相关信息的配置XML,只需要读取这个配置文件,就可以直接 ...
- win7系统的右键菜单只显示一个白色框不显示菜单项 解决办法
如上图所示,桌面或其他大部分地方点击右键菜单,都只显示一个白色框,鼠标移上去才有菜单项看,并且效果很丑 解决办法: 计算机-右键-属性-高级-性能-设置-视觉效果-淡入淡出或滑动菜单到视图,将其前面的 ...
- ios显示一个下载banner
<meta name="apple-itunes-app" content="app-id=432274380" /> 这个标签是告诉iphone的 ...
随机推荐
- HRBUST单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- Samsung_tiny4412(驱动笔记09)----alloc_pages,kmalloc,vmalloc,kmem_cache,class
/*********************************************************************************** * * alloc_pages ...
- Unity3D游戏-愤怒的小鸟游戏源码和教程(一)
Unity愤怒的小鸟游戏教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) AngryEva游戏效果: 1 ...
- POJ 2585:Window Pains(拓扑排序)
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2524 Accepted: 1284 Desc ...
- 什么是PHP无限级分类
注:兄弟连PHP项目视频18讲有详细讲解.PHP和mysql(或是各种数据库)有较深的依奈关系,比如这里就是通过数据库的设 计,id,pid(parent id),path(所有父id构成的路径,如W ...
- [转]G++与GCC的区别
转自http://www.52pojie.cn/thread-58109-1-1.html 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当 ...
- day32 多进程
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...
- 基于 FastAdmin 开发后台流程 (持续更新)
使用 git init 初始化 增加一个自己的git 原始仓库,用于存放自己的代码. 增加一个 fastadmin 的仓库,为了方便以后与官方同步. 自己修改的代码 git Push 到自己的仓库 将 ...
- PHP安全之register_globals (转)
一.register_globals = Off 和 register_globals = On的区别 register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过 ...
- JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象 。
JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.说白了就是能够直接将一个C#对象传送到前台页面成为javascript对 ...