opengles,opengles版本过低怎么升级

http://www.itjxue.com  2023-01-23 06:52  来源:未知  点击次数: 

[OpengGL]渲染流程和程序流程

这节要说的是Opengles的渲染流程和程序流程,都是一些非常基础的东西,觉得已经熟悉的同学可以自行忽略。

以下是一幅经典的Opengl渲染管线流程图

Opengles中包含三种图元方式,点,线,三角形

包含对顶点数据的处理和转换

把所有输入的顶点数据作为输入,将所有点配装成指定图元的形状

(Opengl特有) 把基本图元形式的顶点的几何作为输入,可以通过产生新顶点构造出新的基本图元来生成其它形状

(Opengl特有)可以把基本图元细分为更多的基本图形,创建出更加平滑的视觉效果

像素化,图形映射到屏幕上网络的像素点,生成提供片段给片元着色器处理,光栅化包含一个剪裁处理,会计算舍弃超出定义视窗外的像素

为每一个像素点提供最终的颜色,这里会可以提供纹理题图,如果是3D场景其可以包含3D场景的一些额外数据,例如光线,阴影

对每个像素点进行深度测试,Alpha测试并进行颜色混合操作,进一步合成整个视窗每一个像素点最终要显示的颜色和透明度

如果从API的角度来分析,你会发现有更多的操作。

在输入顶点数据的时候需要线做顶点缓冲,这里可以使用顶点缓冲去对象(VBO),顶点数组对象(VAO)。VBO可以减少IO开销,并使用数组记录每一个快数据对应绑定的类型(顶点位置、法向量),这些数据会存放在GPU上。VAO是使用一个数组来存每一个VBO储存的数据、类型,每次回执时就不需要一个一个传递了。

经过片元着色之后,测试和混合也是分很多种

每一个片元在帧缓冲中对应的位置,若干对应的位置裁剪窗口中则将此片元送入下一个阶段,否则会丢弃此片元,可以在屏幕上指定区域绘制,不在这片区域不进行绘制

深度测试是用片元的深度值和帧缓冲中储存的对应位置的片元的深度值进行比较,深度值小的片元会覆盖或混合深度值大得片元。

模板测试 讲回执区域限定在一定的范围内,一般用于湖面倒影,镜像等场合

如果程序开启了Alpha混合,则可以根据上一阶段对应的片元和帧缓冲的位置片元进行alpha混合

抖动可以模拟更大的色深,需要自己编写算法实现,通过GL_DITHER来控制

opengles并不是直接在屏幕上进行绘制,是预先在帧缓冲区进行绘制,当绘制完之后再下将绘制的结果交换到屏幕上,因此每绘制新的一帧是都需要清除缓冲区的相关数据,否则会产生不正确的绘制效果。

这些都是基本的渲染流程,接下来说一下程序流程,以Android程序为例

这个之前需要了解一下Android中屏幕显示对Opengles的承载,

SurfaceTexture,TextureView, SurfaceView和GLSurfaceView

值得注意的是Android直接内置了Opengles,并内置了GL10,GL20,GL30的类,封装了Opengles的Android API,当然其中也屏蔽了一些细节,对于真正去理解opengles实现有一定的差距。

初学者很多会选用GLSurfaceView来做实现,例如简单绘制图形是没问题的。但是我们如果深入一点学习,例如滤镜,例如录制播放,还是需要使用SurfaceView来做的,因为SurfaceView可以控制绘制的线程,需要自己定义EGL环境,还有SurfaceTexture绑定,同样这也是初学者使用时的难点。

使用一个GLSurfaceView来显示一个三角形为例,这里就屏蔽了EGL、GLThread和SurfaceTexture使用的细节,重点关注在Opengles中的实现。

GLSurfaceView.Render提供三个回调接口

onSurfaceCreated 纹理窗口创建

onSurfaceChanged 视口大小更改

onDrawFrame 绘制

初始化的时候,准备好顶点着色器和片元着色器内容,这里面顶点做色器和片元着色器可以使用字符串读取,也可以使用glsl的shader文件来读取。

加载纹理

创建纹理空间-加载纹理资源-编译纹理

加载纹理绑定到程序

加载纹理-绑定程序

在GLsurfaceView绘制的时候,调用绘制渲染

清屏-指定使用程序-传入参数到着色器-允许GPU读取-绘制图形

日志打印

Opengles2.0对应的是Android 2.2(API 8)

Opengles3.0对应的是Android 4.3(API 18)

Opengles3.1对应的是Android 5.0(API 21)

先将顶点着色器和片段着色器文件贴出来(这是用来渲染普通视频用的),这是使用的OpenGLES3.0版本。(存在兼容性问题),下面只是一部分问题,且这里就不将bug的log写出来了,这是提示大家正确的写法。

顶点着色器

片段着色器

1.没有在着色器文件中标明使用版本的时候默认使用2.0版本。

在上面的着色器文件中添加#version 300 es即表明使用3.0版本,如果不添加则使用默认2.0版本(注意此行必须放在第一行)。同时注意使用3.0的api的时候必须添加此行。

2.3.0中attribute变成了in和out

OpenGL ES 3.0中将2.0的attribute改成了in,顶点着色器的varying改成out,片段着色器的varying改成了in,也就是说顶点着色器的输出就是片段着色器的输入,另外uniform跟2.0用法一样。

3.3.0中使用内置参数gl_FragColor会出问题

这里我们只能自定义颜色向量out vec4 vFragColor;

4.3.0中将GL_OES_EGL_image_external变为了GL_OES_EGL_image_external_essl3

在使用纹理扩展的时候,也就是uniform samplerExternalOES sTexture的时候。在3.0中我们使用GL_OES_EGL_image_external_essl3而不是GL_OES_EGL_image_external。使用相机采集纹理的时候就知道了

5.3.0中将纹理的处理方法统一为texture

在2.0中2D纹理和3D纹理处理分别使用texture2D和texture3D方法,而在3.0后使用texture统一处理。

6.in或者out变量等不能在函数内(如main函数内)声明

OpenglES3.0新特性

OpenglES学习简单总结

渲染管线如下,只要按照步骤调用api就行:

使用opengles,主要就是围绕着顶点着色器和片段着色器做工作,来显示2D、3D物体以及着色和纹理贴图。

创建的顶点,传递给顶点着色器后,会绘制出图形或3D物体,并且可以通过矩阵变换,将物体的不同角度展现在屏幕上。

创建的颜色或纹理,传递给片段着色器,片段着色器可以对传入的信息进行处理,不如变更RGB的值,对纹理进行扭曲变换等,最后将颜色或纹理贴到顶点构造的物体上。

通过顶点着色器和纹理着色器,我们可以他们来:

1)图像处理,美颜、特效等

2)通过不断变更纹理,就可以通过opengles显示动画效果。例如直播间的礼物特效。

3)使用FBO离屏渲染

4)显示三维建模场景

5)显示VR场景(将纹理贴在球形物体上,随着手机移动,球体同步转动。同时将相机位置设置为圆心)

基础概念OpenGLES(一)

渲染管线也就是opengl es的工作流程,这里是opengl es2.0以后的版本的渲染管线

备注:以上所有的操作都是并行处理

open gl 中顶点坐标

static float verData1[8] = {

-1.0f,-1.0f, // 左下角

1.0f,-1.0f, // 右下角

-1.0f,1.0f, // 左上角

1.0f,1.0f, // 右上角

};

对应的纹理坐标

static float uvData[8] = {

0.0f, 1.0f, // 左下角

1.0f, 1.0f, // 右下角

0.0f, 0.0f, // 左上角

1.0f, 0.0f, // 右上角

};

对应的为glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 可以渲染出一张图片

GPU中专门开辟的一块内存用于存储图元的顶点数据,这样每次调用glDrawArrays()函数时,GLSL就是直接从GPU中获取

顶点数据,而不是每次都有cpu拷贝到GPU(cpu拷贝到gpu肯定效率不如直接从GPU中取),这样对于顶点数据比较多时,

可以加快效率;

帧缓冲,也就是通过glGenFramebuffers()函数生成的对象,它主要用于存储opengl es最终的渲染结果。

当需要对纹理进行多次渲染采样时(也就是对一个纹理进行多个着色器程序去处理),而这些渲染采样中间过程是不需要

展示给用户看的,所以就可以额外创建一个FBO对象来专门做这个事情,这个FPO对象就成为为离屏渲染帧缓冲,这个

过程叫做离屏渲染

通过glGenRenderbuffers()生成的缓冲区,他用于将渲染的结果呈现到屏幕上,需要与FBO绑定

opengl es api是用来进行图像渲染操作的,

egl api是由各个操作系统实现的系统api,它主要的作用就是创建窗口,创建opengl 上下文环境等。可以由各自厂商自行定义,使用通用的EGL接口。

如苹果就是EAGL,安卓就可以用EGL来自行管理,也可以用GLSurface系统创建opengl 环境

opengles移植到opengl

题主是否想询问“opengles能否移植到opengl”?能。opengles和opengl的框架结构和运算方式是一样的,所以能移植。opengl是个定义了一个跨编程语言、跨平台的编程接口的规格,多用于三维图象。

(责任编辑:IT教学网)

更多

推荐广告特效文章