openGL ES

本文深入探讨OpenGL ES的工作原理,包括图形卡驱动程序中的管线过程,以及OpenGL ES各版本的特性,如OpenGL ES 1.x的固定管线,2.x的可编程管线,3.x的新特性如支持更多缓冲区对象、GLSL ES 3.0着色语言等。同时介绍了OpenGL中的坐标系、常见概念和使用步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章主要是对opengl的一些重要的知识点进行总结:
1、opengl的工作原理
通常采用图形卡驱动程序的形式:
这里写图片描述

管线(pipeline)是一个过程,可能涉及两个或多个独特的阶段或步骤.应用程序进行OpenGL函数调用时,这些命令被放置在一个命令缓冲区.该缓冲区最终填满了命令,定点数据,纹理数据等东西.缓冲区被刷新时,命令和数据就传递给下一个阶段.
这里写图片描述

2、OpenGL ES(OpenGL for Embedded Systems)是从OpenGL剪裁或定制过来了,去除了glBegin/glEnd,四边形(GL_QUADS),多边形(GL_POLYGON)等复杂图元等许多非必要的特性.
这里写图片描述
pipeline:(管线)
opengl application: geometry(几何图形) + texture(纹理贴图)
vertex data(顶点数据): lighting(光照) +transform(变换) +scale(缩放)
geometry(几何图形): rasterization(光栅) +clipping(剪裁)
fragment(段): fog(雾) + texture(纹理).
framebufer(帧缓冲区): stecil(蒙版) z-test(深度测试) alpha(透明) blending(混合)
eyeball(眼球): 就看到物体了
3、对OpenGL ES各个版本的简单介绍
OpenGL ES1.x针对固定管线硬件,OpenGL ES1.0是以OpenGL1.3规范为基础的,OpenGL ES1.1是以OpenGL1.5为基础的,他们分别又支持common和common lite两种profile.
OpenGLES2.x针对可编程管线硬件. OpenGL ES2.0是参照OpenGL2.0规范定义的.
OpenGL ES 3.x 目前在高通骁龙600系列及其以上的版本中支持。
小插曲:对3.x中新特性的描述:(可以忽略)
OpenGL ES 3.0 带来很多新特性,根据 AnandTech 的解释:
 支持更多缓冲区对象,在 OpenGL ES 2.0 时中,缓冲区对象的规范有模糊之处。名字一样缓冲区对象,在实际渲染中对表现却有细微的差别。针对这个问题 OpenGL ES 3.0 制定了更详细对格式规范。新版 OpenGl ES 还增加对 Uniform Buffer Object 的支持;
 新版 GLSL ES 3.0 着色语言,支持 32 位整数和浮点数据类型以及操作。之前版本的着色语言只支持精度更低的,这样虽然能够加快计算的速度,所需的资源也更少,但当着色器的复杂度增加,出错也随之增加。同时,新版着色语言的语法更贴近 GLSL;
 支持遮挡查询(Occlusion Query)以及几何体实例化(Geometry Instancing)。通过遮挡查询,能够让 GPU 知道 3D 场景中,哪些物体被其它物体完全遮挡,这些完全被遮挡的物体 GPU 不会去渲染。几何体实例化是通过对具有相同顶点数据的几何体,赋予不同的空间位置、颜色或纹理等特征,从而创造出不同实例对象的技术。这两个特性都能够节省硬件资源,提高 3D 图形渲染的性能。
 增加多个纹理的支持。包括浮点纹理、深度纹理、顶点纹理等等。
 多重渲染目标(Multiple Render Targets),让 GPU 一次性渲染多个纹理。
 多重采样抗锯齿(MSAA Render To Texture),让 3D 物体对边缘不出现毛刺,可提升图像效果。
 使用统一的纹理压缩格式 ETC;
4、OpenGL中的坐标系
对象空间,相对于每个对象自身
相机,眼睛,空间是针对视点
投影,剪裁,空间他们是平面的屏幕或者是图像上的视口
5、OpenGL中常见的几个概念
GLSurfaceView:GL表层视图,输出openGL画面的控件.
GLSurfaceView.Renderer:openGL渲染器,绘制openGL的类.
平截头体(frustum)也叫视景体,拍摄画面的一个区域,是一个棱台,对投影矩阵进行操纵.
投影:
透视投影:有深度,越远越小.
正投影:没有深度,相同大小.
6、使用openGL步骤:

1.创建GLSurfaceView对象
2.创建GLSurfaceView.renderer实现类.
3.设置activity的contentView,以及设置view的render对象.
4.实现render类的过程.
    a.onSurfaceCreate()方法
        1.设置清屏的颜色和启用顶点缓冲区
        //设置清屏色
        gl.glClearColor(0, 0, 0, 1);
        //启用顶点缓冲区.
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    b.onSurfaceChanged()方法
        1.设置viewport(视口)
            gl.glViewport(0, 0, width, height);
        2.操纵投影矩阵,设置平截头体(比例通常和视口比例相同,否则输出画面会走样)
            //矩阵模式,投影矩阵,openGL基于状态机
            gl.glMatrixMode(GL10.GL_PROJECTION);
            //加载单位矩阵
            gl.glLoadIdentity();
            //平截头体
            gl.glFrustumf(-1f, 1f, -ratio, ratio, 3, 7);//这些参数都是单位不是真正的距离
    c.onDrawFrame()方法
        1.清除颜色缓冲区
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        2.操纵模型视图矩阵,设置眼球的参数
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadIdentity();//加载单位矩阵
            GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0);
        3.定义图形顶点坐标值数组
            float[] coords = {
                0f,0.5f,0f,
                -0.5f,-0.5f,0f,
                0.5f,-0.5f,0f};
        4.将顶点坐标转换成缓冲区数据
            //分配字节缓存区空间,存放顶点坐标数据
            ByteBuffer ibb = ByteBuffer.allocateDirect(coords.length * 4);
            //设置的顺序(本地顺序)
            ibb.order(ByteOrder.nativeOrder());
            //放置顶点坐标数组
            FloatBuffer fbb = ibb.asFloatBuffer();
            fbb.put(coords);
            //定位指针的位置,从该位置开始读取顶点数据
            ibb.position(0);
        5.设置绘图颜色
            gl.glColor4f(1f, 0f, 0f, 1f);
        6.指定顶点缓冲区指针
            //3:3维点,使用三个坐标值表示一个点
            //type:每个点的数据类型 
            //stride:0,跨度.
            //ibb:指定顶点缓冲区
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ibb);
        7.绘图
            //0:起始点:
            //3:绘制点的数量
            gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值