android OpenGL ES 笔记 2-FrameBuffer
- 格式:docx
- 大小:26.39 KB
- 文档页数:5
opengl帧缓冲纹理原理
OpenGL帧缓冲对象(Framebuffer Object,FBO)是一种用于渲染到纹理的技术,它允许我们在不直接将渲染结果显示到屏幕上的情况下进行渲染。
这种技术对于实现后期处理效果(Post-processing effects)和渲染到纹理(Rendering to texture)非常有用。
首先,让我们了解一下OpenGL纹理的基本原理。
纹理是一种二维图像,它可以被应用到几何图元上以呈现出更加生动的外观。
在OpenGL中,纹理可以被绑定到帧缓冲对象上,使得我们可以在渲染过程中将结果直接渲染到纹理上,而不是直接渲染到屏幕上。
帧缓冲对象是一个可以包含渲染结果的容器,它可以包含颜色缓冲、深度缓冲和模板缓冲。
在使用帧缓冲对象时,我们可以将渲染的结果存储到一个或多个附加的纹理或渲染缓冲中,而不是直接输出到屏幕上。
这使得我们可以在渲染过程中对渲染结果进行进一步处理,或者将其用作输入来创建复杂的效果。
在使用帧缓冲对象时,我们需要执行以下步骤:
1. 创建帧缓冲对象并绑定它。
2. 创建一个或多个纹理附件或渲染缓冲附件,并将它们附加到帧缓冲对象上。
3. 执行渲染操作,将结果渲染到帧缓冲对象的附件上。
4. 如果需要,可以将帧缓冲对象的附件纹理用作输入进行后期处理。
在OpenGL中,帧缓冲对象和纹理的使用可以实现各种复杂的渲染技术,例如抗锯齿、阴影映射、后期处理效果等。
通过将渲染结果存储到纹理中,我们可以在渲染过程中对结果进行多次处理,从而实现更加生动和复杂的视觉效果。
帧缓冲对象和纹理的结合使用为OpenGL渲染提供了更大的灵活性和功能性。
OpenGL ES入门一、前言OpenGL ES是Khronos Group创建的一系列API中的一种(官方组织是:/)。
在桌面计算机上有两套标准的3DAPI:Direct3D和OpenGL。
Direct3D实际上是运行在windows操作系统上的标准3DAPI,而OpenGL则是跨平台的,适用于Linux、多种UNIX、MAC OS X和windows。
由于OpenGL得到了广范围的认可,所以,基于嵌入式的3DAPI---OpenGL ES也就应运而生。
沃Phone使用的芯片高通7227,它能很好的提供对OpenGL ES的支持,了解OpenGL ES 的种种特性,不仅能开发出很好的适用于沃Phone的3D游戏、3D应用等。
借助于OpenGL ES的平台无关性,只要稍微修改EGL,理论上就可以将开发的3D游戏、3D应用移植到任何支持OpenGL ES的平台上去。
本篇文档就从零开始,深入简出,跟大家介绍一下OpenGL ES的原理和开发。
OpenGL ES简介什么是OpenGL ESOpenGL ES是一套适用于手持嵌入式设备的3DAPI。
比如手机、PDA、汽车、航空等等上面都可以使用到OpenGL ES。
OpenGL ES是免授权费的、跨平台的、功能完善的2D和3D 图形应用程序接口API,它是桌面OpenGL的子集,是从OpenGL裁剪定制而来的。
由于手持设备的相关局限性,OpenGL ES相对于OpenGL不可避免的进行了相关的精简。
去除了OpenGL中比如glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POL YGONS)等复杂图元等许多非绝对必要的特性。
但是OpenGL方面的很多知识,OpenGL ES都是可以借鉴的。
OpenGL ES其实是一个状态机(State machine),它保存一种状态直至其改变。
每个状态都有本身默认的缺省值,可以通过相关的查询和设置函数进行相关的查询和设置。
glmark2参数glmark2是一款用于测试Linux系统3D图形性能的工具。
通过运行各种OpenGL和OpenGL ES场景,glmark2能够评估系统的图形性能和稳定性。
本文将介绍glmark2的参数及其使用方法。
参数一:--run-all--run-all参数用于运行glmark2的所有测试场景。
使用该参数,可以全面评估系统的3D图形性能。
执行命令如下:glmark2 --run-all参数二:--fullscreen--fullscreen参数用于以全屏模式运行测试场景。
在全屏模式下,可以更好地展示图形性能。
执行命令如下:glmark2 --fullscreen参数三:--off-screen--off-screen参数用于在后台运行各个测试场景,不在屏幕上显示。
该参数适用于服务器等没有图形界面的系统。
执行命令如下:glmark2 --off-screen参数四:--no-framebuffer-object--no-framebuffer-object参数用于禁用帧缓冲对象。
帧缓冲对象是OpenGL中一种重要的机制,用于优化图形渲染过程。
在某些情况下,禁用帧缓冲对象可能会导致更真实的测试结果。
执行命令如下:glmark2 --no-framebuffer-object参数五:--validate--validate参数用于验证测试场景的正确性。
使用该参数,可以检测系统是否支持所需的OpenGL特性。
执行命令如下:glmark2 --validate参数六:--timeout--timeout参数用于设置测试场景的超时时间。
如果某个测试场景运行时间超过设定的超时时间,glmark2将会停止该测试场景并记录结果。
执行命令如下:glmark2 --timeout 300参数七:--show-result--show-result参数用于在测试完成后显示测试结果,并打印出每个测试场景的分数。
OpenGL ES基础入门本文摘自网络,本人只是进行了一下规整,只作为学习参考使用,内容覆盖面并不全,但对于新手入门来说,有一定的帮助作用。
OpenGL ES基础入门 (1)了解OpenGL ES社区 (1)初始化EGL (2)初始化GLES (3)Hello,EGL (14)加载模型 (20)材质纹理 (24)光照 (30)压缩纹理 (32)全屏抗锯齿FSAA (40)了解OpenGL ES社区学习任何一种新技术,要先对它有一个全局性的了解,这样才知道用功的方向。
而这全局性的了解中,非常重要的一块就是要了解该技术的社区情况。
OpenGL|ES的官方组织是:/该组织关注于手持和移动平台上的动态媒体编著、播放所需的API,并致力于为这些API建立无限权费用的开放标准。
(focused on the creation of open standard, royalty-free APIs to enable the authoring and accelerated playback of dynamic media on a wide variety of platforms and devices.)在Khronos的网站上,有大量开发者资源,其中最重要的部份就是规范文档和头文件(EGL, GLES 1.x, GLES 2.x),同时还列出了很多的例子和教程。
OpenGL|ES是根据手持及移动平台的特点,对OpenGL 3D图形API标准进行裁剪定制而形成的,因此大多数OpenGL方面的知识都是可以借鉴的,因此保持对OpenGL官方组织的关注是非常有益的,OpenGL ARB网站在。
Khronos对两个API的关系有非常清楚的定义:目前,各路厂商对OpenGL ES的支持才刚刚起步,在很多平台上都还没有官方的OpenGL ES实现,在这种情况,利用一些开源的产品也可以开始相关的研究和开发。
其中发展得比较好的是Vicent Mobile 3D Rendering Library (1.x/projects/ogl-es/ , 2.x /projects/ogles2 ),基于OpenGL ES的3D 引擎/projects/es3d/,在OpenGL世界里广受欢迎的GLUT也出了ES版本(/projects/glutes/) ,不过个人感觉,有了EGL标准,开发者不必再面对glx/wgl/agl等一堆平台相关的初始化方法,glut的作用已经小多了,不过对于从OpenGL平台转过来的用户还是非常友好的。
OpenGLES2.0⼊门详解引⾃:/wangyuchun_799/article/details/77369281.决定你要⽀持的OpenGL ES的版本。
⽬前,OpenGL ES包含1.1和2.0两个版本,iPhone 3G+和iPad开始⽀持OpenGL ES2.0。
⽽且这两个版本之间的差异⾮常⼤,不仅仅在编程思想上,API之间的差距也很⼤。
因此,如果你想使⽤OpenGL ES开发3D程序或游戏,那么⾸先就要决定使⽤哪个版本,还是说两个版本都⽀持。
OpenGL ES定义了代表不同版本的宏:enum{kEAGLRenderingAPIOpenGLES1 = 1, //1.1版kEAGLRenderingAPIOpenGLES2 = 2 //2.0版}typedef NSUInteger EAGLRenderingAPI;以iPhone代码为例,你可以通过以下⽅式判断⽤户设备所⽀持的OpenGL ES版本,如果⽀持2.0,就使⽤2.0进⾏渲染;如果仅⽀持1.1,则使⽤1.1版进⾏渲染:EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2; //默认优先使⽤2.0版m_context = [[EAGLContext alloc] initWithAPI:api]; //使⽤2.0版初始化EAGLContextif (!m_context ) { //使⽤2.0版初始化EAGLContext失败api = kEAGLRenderingAPIOpenGLES1; //将API设为1.1版m_context = [[EAGLContext alloc] initWithAPI:api];//使⽤1.1版初始化EAGLContext}if (!m_context || ![EAGLContext setCurrentContext:m_context]) { //1.1版初始化失败,则释放内存[self release];return nil;}if (api == kEAGLRenderingAPIOpenGLES1) {//使⽤1.1版开始渲染}else {//使⽤2.0版开始渲染}2.你想让你的OpenGL ES程序跨⼿机平台运⾏么?Android、iPhone、windows phone⼿机系统是当前最主流的⼿机系统,如何才能让我们编写出来的程序可以跨平台运⾏呢?好消息是,这三个平台都⽀持OpenGL ES,⽽且都⽀持C++语⾔。
OpenGL.ES在Android上的简单实践:18(自定义Android-EGL)1、确定需求这次的项目需求总结下来是这样的:一个摄像头预览界面,一个按钮触发屏幕录制,录制视频带上水印效果。
1. 摄像头预览2. 屏幕录制3. 录制视频在指定位置附带上水印确定需求后,我们逐一分析模块组成并完成它。
So,Talk is cheap,Let me show codes!2、EGL+Surface=EGLSurface要想预览的时候增加水印(滤镜)效果,必须有EGL环境+shader的滤镜特效。
所以我们先从简单开始,第一步的需求就是创建EGL,并能正常显示手机摄像头。
首先创建我们这次的测试Activity->ContinuousRecordActivity并读取布局界面的SurfaceView,使用SurfaceView是方便直接获取Surface渲染表面。
1.public class ContinuousRecordActivity extends Activity implements SurfaceHolder.Callback {2.3.public static final String TAG = "ContinuousRecord";4.5.SurfaceView sv;6.7.@Override8.protected void onCreate(Bundle savedInstanceState) {9.super.onCreate(savedInstanceState);10.setContentView(yout.continuous_record);12.sv = (SurfaceView) findViewById(R.id.continuousCapture_surfaceView);13.SurfaceHolder sh = sv.getHolder();14.sh.addCallback(this);15.}16.17.@Override18.public void surfaceCreated(SurfaceHolder surfaceHolder) {19.Log.d(TAG, "surfaceCreated holder=" + surfaceHolder);20.//首先我们描述一下在这里即将发生的:21.// surface创建回调给开发者我们,然后我们创建一个EGL上下文,组成一个我们需要的EGLSurface22.// EglCore = new EglCore();23.// 把Egl和native的surface组合成=EglSurface,并保存下来。
简介Fram eBuffer 在Android中并不像在其它GUI那样直观,抽象的层次比较多,加上GUI 的更新是通过OpenGLES来做的。
所以让人很难搞清GUI更新的整个流程,最近要准备一个讲稿,所以花了一些去研究,这里做点笔记供大家参考,源代码是基于高通平台的,这些代码在网上都可以下载。
Fram eBuffer 的相关组件如下图所示:SurfaceFlinger是一个服务,主要是负责合成各窗口的Surface,然后通过OpenGLES 显示到FrameBuffer上。
SurfaceFlinger本身比较重要而且比较复杂,以后专门写一篇吧。
DisplayHardware是对显示设备的抽象,包括FrameBuffer和Overlay。
它加载Fram eBuffer和Overlay插件,并初始化OpenGLES:mNativeWindow = new FramebufferNativeWindow();framebuffer_device_t const * fbDev = mNativeWindow->getDevice(); if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) { overlay_control_open(module, &mOverlayEngine);}surface = eglCreateWindowSurface(display, config,mNativeWindow.get(), NULL);eglMakeCurrent(display, surface, surface, context);Fram ebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开fram ebuffer设备。
FramebufferNativeWindow并不直接使用framebuffer,而是自己创建了两个Buffer:1.queueBuffer负责显示一个Buffer到屏幕上,它调用fb->post去显示。
framebuffer 编程(原创实用版)目录1.framebuffer 概述2.framebuffer 编程的基本原理3.framebuffer 编程的步骤4.framebuffer 编程的实例5.framebuffer 编程的优缺点正文【1.framebuffer 概述】Framebuffer(帧缓冲区),也被称为显存,是计算机图形学中的一种存储设备,主要用于暂时存储显卡生成的图像。
Framebuffer 是一个高分辨率的缓冲区,可以存储屏幕上的所有像素。
它主要用于将计算机生成的二维图像转换为显示器可以识别的信号,以便在屏幕上显示。
【2.framebuffer 编程的基本原理】Framebuffer 编程的基本原理是通过编程控制显卡的帧缓冲区,从而实现对图像的控制。
它主要包括以下几个步骤:1.配置 framebuffer:设置 framebuffer 的属性,如宽度、高度、颜色深度等。
2.将图像数据写入 framebuffer:通过显卡的命令将图像数据写入framebuffer。
3.提交 framebuffer:将 framebuffer 中的数据提交给显卡,开始渲染。
【3.framebuffer 编程的步骤】Framebuffer 编程的基本步骤如下:1.初始化 framebuffer:首先,需要初始化 framebuffer,包括分配内存、设置属性等。
2.绑定 framebuffer:将 framebuffer 绑定到特定的渲染管线。
3.写入图像数据:通过显卡的命令将图像数据写入 framebuffer。
4.提交 framebuffer:将 framebuffer 中的数据提交给显卡,开始渲染。
5.释放 framebuffer:渲染完成后,需要释放 framebuffer。
【4.framebuffer 编程的实例】以下是一个简单的 framebuffer 编程实例:```c#include <GL/glut.h>void display() {glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区glLoadIdentity(); // 重置变换矩阵glOrtho(0, glutGet(GL_WIDTH), glutGet(GL_HEIGHT), 0, -1, 1); // 设置透视投影矩阵glBegin(GL_QUADS); // 开始绘制四边形glColor3f(1.0, 0.0, 0.0); // 设置颜色为红色glVertex2f(-0.5, -0.5); // 绘制左下角glVertex2f(0.5, -0.5); // 绘制右上角glVertex2f(0.5, 0.5); // 绘制右上角glVertex2f(-0.5, 0.5); // 绘制左上角glEnd(); // 结束绘制glFlush(); // 提交绘制结果}int main(int argc, char** argv) {glutInit(&argc, argv);glutCreateWindow("Framebuffer Programming");glutDisplayFunc(display);glutMainLoop();return 0;}```【5.framebuffer 编程的优缺点】Framebuffer 编程的优点:1.灵活性:framebuffer 编程可以实现对图像的精确控制,包括颜色、亮度、对比度等。
opengl帧缓冲理解OpenGL帧缓冲是OpenGL中的一个重要概念,它是一种用于离屏渲染的技术。
在OpenGL中,帧缓冲是一个用于存储渲染结果的缓冲区,它可以被用来实现各种高级渲染效果,比如反射、抗锯齿、阴影等。
帧缓冲的基本原理是将渲染结果存储到一个离屏缓冲区中,然后再将这个缓冲区中的内容复制到屏幕上。
这样做的好处是可以在不影响屏幕显示的情况下进行渲染,从而实现各种高级效果。
在OpenGL中,帧缓冲是由多个缓冲区组成的。
其中最重要的是颜色缓冲区,它用于存储渲染结果的颜色信息。
除了颜色缓冲区之外,还有深度缓冲区和模板缓冲区,它们分别用于存储渲染结果的深度信息和模板信息。
使用帧缓冲的过程可以分为以下几个步骤:1. 创建帧缓冲对象:使用glGenFramebuffers函数创建一个帧缓冲对象,并将其绑定到OpenGL上下文中。
2. 创建纹理对象:使用glGenTextures函数创建一个纹理对象,并将其绑定到OpenGL上下文中。
3. 将纹理对象附加到帧缓冲对象上:使用glFramebufferTexture2D 函数将纹理对象附加到帧缓冲对象的颜色缓冲区上。
4. 渲染场景:使用glViewport函数设置渲染视口,并使用glClear 函数清空颜色缓冲区、深度缓冲区和模板缓冲区。
5. 将渲染结果复制到屏幕上:使用glBlitFramebuffer函数将帧缓冲区中的内容复制到屏幕上。
使用帧缓冲可以实现各种高级渲染效果,比如反射、抗锯齿、阴影等。
例如,使用帧缓冲可以实现实时反射效果,即在场景中添加一个反射平面,将其作为帧缓冲区,然后将反射平面的纹理映射到场景中的物体上,从而实现反射效果。
帧缓冲是OpenGL中非常重要的一个概念,它可以帮助我们实现各种高级渲染效果,提高场景的真实感和逼真度。
framebuffer设备原理Framebuffer是一种在计算机图形处理中常见的设备,它用于存储显示屏上每个像素的颜色信息。
Framebuffer设备是计算机系统中的一种虚拟设备,它提供了一种机制,使得操作系统和应用程序能够与显示硬件进行高效地交互。
本文将介绍Framebuffer设备的基本原理,并提供相关参考内容供读者进一步学习。
Framebuffer设备的基本原理是将每个显示屏上的像素映射到内存中的一块连续区域,称为帧缓冲区。
帧缓冲区是一个二维数组,每个元素表示一个像素的颜色值。
操作系统和应用程序可以直接读取和写入帧缓冲区中的数据,从而实现图形的显示和更新。
Framebuffer设备的工作流程如下:1. 操作系统初始化:在系统启动过程中,操作系统会检测并初始化Framebuffer设备。
这通常涉及分配内存空间,设置设备参数等操作。
2. 应用程序与Framebuffer设备交互:应用程序可以通过操作系统的API或系统调用与Framebuffer设备进行交互。
例如,应用程序可以请求读取或写入帧缓冲区的数据。
3. 显示控制器更新显示:当帧缓冲区中的数据发生变化时,显示控制器会将新的数据发送到显示设备上,从而更新屏幕上的图像。
Framebuffer设备的设计有以下一些关键要点:1. 缓冲区管理:Framebuffer设备需要分配一块连续的内存作为帧缓冲区,用于存储图像数据。
操作系统需要设计合理的算法来管理帧缓冲区的分配和释放,以实现高效的图像操作。
2. 像素格式:不同的显示设备支持不同的像素格式,例如RGB、RGBA等。
Framebuffer设备需要灵活支持各种不同的像素格式,并能够进行格式转换以适应不同的应用需求。
3. 双缓冲技术:为了避免图像闪烁和撕裂等问题,Framebuffer 设备通常采用双缓冲技术。
双缓冲技术使用两个帧缓冲区,一个用于显示当前的图像,另一个用于更新下一帧的图像。
这样,在切换帧缓冲区时,可以实现无闪烁的图像更新。
FrameBuffer对象被用来存放渲染的结果,FrameBuffer可以使你对颜色,模型,色深等的创建精确。
下面是创建FrameBuffer的方法:
1:创建framebuffer对象。
2:创建一个或多个对象 (renderbuffers or textures),对他们进行存储分配,将它们付着到framebuffer的付着点上去。
3:测试framebuffer的完整性。
下面是Sample Code
生成一个OfferScreenFramebuffer对象
1:生成并绑定framebuffer
2:生成colorRenderbuffer,分配内存,付着到framebuffer上。
3:生成depthRenderbuffer,分配内存,付着到framebuffer上。
4,检查framebuffer的完整性,在需要在frame属性被编辑后调用:
用framebuffer进行纹理渲染:
1:创建一个framebuffer对象。
2:创建目的纹理,并将其付着到framebuffer上。
3:生成depthRenderbuffer,分配内存,付着到framebuffer上。
(同上)
4:检查framebuffer的完整性。
(同上)
渲染Core Animation Layer:
在iOS里面都是由Core Animation Layer来作显示效果的,但是OpenGL ES没有直接使用CAEAGL Layer而是定义一个UIView的子类,UIView可以被CAEAGLLayer支持。
下面是生成OpenGL ES的View步骤:
1:生成一个UIView的子类用来做OpenGL ES的View;
2:重写(override)layerClass方法,使得你的View使用CAEAGLLayer作为它的底层。
layerCla ss返回一个CAEAGLLayer。
3:在View 的初始化过程中,读取view的layer属性,代码如下:
myEAGLLayer = (CAEAGLLayer*)yer;
4:设置layer的属性。
为了最好的效果,设置opaque=yes;使其不透明。
5:分配一个Context然后设置它为currentContext;
6:生成一个FrameBuffer(上面有详细叙述)
7:生成一个color renderbuffer,通过调用 Context的renderbufferStorage:fromDrawable:方法分配空间给他。
下面是sampleCode:
注意:如果Layer的范围改变的时候,必须重新reallocate renderbuffer,不然会和显示尺寸出现冲突。
8:读取的renderbuffer高度和宽度。
9:生成和付着depth buffer;
10 :测试framebuffer。
绘制Framebuffer:
绘制FrameBuffer有两种方法:1:按需求绘制2:在动画循环中绘制。
按需求绘制:适合不经常变化或者当用户有输入才进行相应的变化的状况。
注意:OpenGL ESview不应该使用DrawRect方法,而应该构造自己的方法去绘制。
在数据变化,或者需要绘制的时候去调用自己的方法。
这样作的原因是为了防止UIKit在drwaRect的方法执行时被影响。
画循环中绘制:当你的数据很频繁的变化的话,请使用这种绘制方法。
比如游戏,或者对动态效果要求很严格,需要有圆滑的动画的时候。
在iOS中,最好的方法是把你的绘制方法和CADisplayLink对象设置在一起。
这个对象可以使你的绘图频率和屏幕的刷新速率同期。
下面使创建一个CADisplayLink的SampleCode:
在你的drawFrame方法中。
请读取displaylink的timestamp属性。
用来了解下次drawframe的时刻。
用来计算你下次显示的数据。
在大多数情况下displaylink的启动频率大概使60Hz,根据硬件环境不同会有变化。
但是动画不需要这么快的刷新频率(电影24Hz)。
你可以设置一个display link的frameInterval属性,来决定,屏幕每刷新几次进行一次描绘。
加入frameInterval是3的话,大概就是20hz的绘制频率。