没有合适的资源?快使用搜索试试~ 我知道了~
通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸
3 下载量 77 浏览量
2021-01-20
09:16:06
上传
评论 1
收藏 187KB PDF 举报
温馨提示
试读
7页
当开发基于软件模式的游戏时,通过缩放视频缓冲区来适应显示尺寸是最棘手的问题之一。当面对众多不同的分辨率时(比如开放环境下的Android),该问题会变得更加麻烦,作为开发人员,我们必须尝试在性能与显示质量之间找到最佳平衡点。正如我们在第2章中看到的,缩放视频缓冲区从最慢到最快共有3种类型。 软件模拟:3中类型中最慢,但最容易实现,是没有GPU的老款设备上的最佳选择。但是现在大部分智能手机都支持硬件加速。 混合模式:这种方式混合使用软件模拟(创建图像缓冲区)和硬件渲染(向显示屏绘制)两种模式。这种方法速度很快,而且可以在分辨率大于256×256的任意屏幕上渲染图像。 硬件加速模式:3种类型中最快
资源详情
资源评论
资源推荐
通过通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸混合模式缩放视频缓冲区来适应显示尺寸
当开发基于软件模式的游戏时,通过缩放视频缓冲区来适应显示尺寸是最棘手的问题之一。当面对众多不同的分辨率时(比如
开放环境下的Android),该问题会变得更加麻烦,作为开发人员,我们必须尝试在性能与显示质量之间找到最佳平衡点。正如
我们在第2章中看到的,缩放视频缓冲区从最慢到最快共有3种类型。
软件模拟软件模拟:3中类型中最慢,但最容易实现,是没有GPU的老款设备上的最佳选择。但是现在大部分智能手机都支持硬件加
速。
混合模式混合模式:这种方式混合使用软件模拟(创建图像缓冲区)和硬件渲染(向显示屏绘制)两种模式。这种方法速度很快,而且可以
在分辨率大于256×256的任意屏幕上渲染图像。
硬件加速模式硬件加速模式:3种类型中最快,但最难实现。这取决于游戏的复杂程度,需要更加强劲的GPU。如果有好的硬件,这种方法
就可以创造出令人震撼的质量和效果。但在终端设备比较分裂的平台上,比如Android,这将是十分艰难的选择。
这里,我们选择第二种方式,也是在终端设备分裂的平台上的最佳选择。你拥有软件渲染器,并希望将游戏适配到任意分辨率
的显示屏上。此方法非常适合模拟器游戏、街机游戏、简单的射击游戏等。它在各种低端、中端、高端设备上都表现很好。
下面我们开始介绍混合模式并探讨为什么这种方法更加可行。然后,将深入研究这种方法的实现,包括如何初始化surface并
通过实际缩放来绘制到纹理。
1. 为什么使用混合缩放为什么使用混合缩放
这种缩放技术背后的原理很简单:
你的游戏根据给定的尺寸创建图像缓冲区(通常采用像素格式RGB565,即移动设备最常用的格式)。例如320×240,这是典型
的模拟器尺寸。
当一张分辨率为320×240的图像需要被缩放至平板电脑的尺寸(1024×768)或其他任意相同屏幕的设备时,我们可以使用软件
模拟的方式来完成缩放,但会慢的令人无法忍受。而采用混合模式进行缩放,需要创建OpenGL ES纹理并将图片(320×240)渲
染到GL四边形上。
纹理会通过硬件被缩放到适合显示屏的尺寸(1024×768),从而你的游戏性能将得到显著提升。
从实现的角度看,这个过程可描述如下:
初始化OpenGL ES纹理:在游戏视频被初始化的阶段,必须创建硬件surface。其中包含简单的纹理,要显示的视频图像会被
渲染至到该纹理(详见代码清单1与代码清单2)。
将图像缓冲区绘制到纹理:在游戏循环的末端,渲染要显示的视频图像到纹理,该纹理会自动缩放至适合显示屏的尺寸(详见
代码清单3)。
代码清单代码清单1 创建创建RGB656格式的空纹理格式的空纹理
代码如下:
<SPAN style=”FONT-SIZE: 14px”>// 纹理ID
static unsigned int mTextureID;
// 被用来计算图片绘制在纹理上的X、Y偏移量
static int xoffset;
static int yoffset;
/**
* 创建RGB565格式的空纹理
* 参数: (w,h) 纹理的宽, 高
* (x_offsety_offset): 图片绘制在纹理上的X、Y偏移量
*/
static void CreateEmptyTextureRGB565 (int w, int h, int x_offset, int y_offset)
{
int size = w * h * 2;
xoffset = x_offset;
yoffset = y_offset;
// 缓冲区
unsigned short * pixels = (unsigned short *)malloc(size);
memset(pixels, 0, size);
// 初始化GL状态
glDisable(GL_DITHER);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
glClearColor(.5f, .5f, .5f, 1);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
// 创建纹理
glGenTextures(1, &mTextureID);
glBindTexture(GL_TEXTURE_2D, mTextureID);
// 纹理参数
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// RGB565格式的纹理
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_
SHORT_5_6_5 , pixels);
free (pixels);
weixin_38677648
- 粉丝: 5
- 资源: 886
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C语言基础-C语言编程基础之Leetcode编程题解之第39题组合总和.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第38题外观数列.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第37题解数独.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第36题有效的数独.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第35题搜索插入位置.zip
- index.wxml
- C语言基础-C语言编程基础之Leetcode编程题解之第33题搜索旋转排序数组.zip
- 基于Python实现的手写数字识别系统源码.zip
- 从网页提取禁止转载的文字
- C语言基础-C语言编程基础之Leetcode编程题解之第32题最长有效括号.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0