跳转到主要内容

Opengl ES(五)基础总结

demi 提交于

Opengl ES基础系列文章是音视频学习的图形图像部分,旨在通过这部分学习,能够把Opengl ES和视频结合在一起,最终形成一个完整的知识体系。   

经过前面章节学习,我们对Opengl ES在android中开发有了基本的整体认识,知道顶点着色器和片段着色器,以及它们的写法,可以绘制图形(三角形)和图像(纹理操作),下面我们对前面章节的学习做个总结:

<center><img width="600" src="http://imgtec.eetrend.com/files/2019-07/%E5%8D%9A%E5%AE%A2/100044267-75…; alt=""></center><br>

<font style="line-height: 40px;" color="Purple"> 1)EGL环境的搭建</font>

&nbsp; • &nbsp;获取默认显示设备
&nbsp; • &nbsp;初始化设备
&nbsp; • &nbsp;配置显示设备
&nbsp; • &nbsp;创建EGLContext
&nbsp; • &nbsp;创建EGLSurface
&nbsp; • &nbsp;EGLContext关联到当前线程

<font style="line-height: 40px;" color="Purple">2)attribute、uniform、varying修饰符</font>

&nbsp; • &nbsp;attribute 只在顶点着色器中使用,用来保存顶点、纹理等坐标数据
&nbsp; • &nbsp;uniform 修饰的变量有全局唯一性,可在顶点和片元着色器使用,不改变其值
&nbsp; • &nbsp;varying 其修饰的变量主要用来在顶点、片元着色器以及光栅阶段透传数据,可在顶点和片元着色器中使用

<font style="line-height: 40px;" color="Purple">3)顶点和片元着色器</font>

&nbsp; • &nbsp;Opengl ES着色语言,类似C语言写法
&nbsp; • &nbsp;有变量定义
&nbsp; • &nbsp;有函数定义
&nbsp; • &nbsp;Opengl ES执行自动调用main方法

&nbsp; • &nbsp;用法
int iShader = GLES20.glCreateShader();
GLES20.glShaderSource(iShader, source);
GLES20.glCompileShader(iShader);
上面就是生成一个着色器的标准步骤。

<font style="line-height: 40px;" color="Purple">4)program</font>

&nbsp; • &nbsp;program就是把顶点和片元着色器链接成Opengl ES能够识别的代码

&nbsp; • &nbsp;用法
int iProgram = GLES20.glCreateProgram();
GLES20.glAttachShader(iProgram, iShader);
GLES20.glLinkProgram(iProgram);

<font style="line-height: 40px;" color="Purple">5)attribute变量存取</font>

&nbsp; • &nbsp;先在program中找到对应的索引
&nbsp; • &nbsp;然后把数据赋值给对应的索引
&nbsp; • &nbsp;激活属性是其对Opengl ES可见
&nbsp; • &nbsp;用法
int location = GLES20.glGetVertexAttribLocation(iProgram, "vVertexCoor");
GLES20.glVertexAttribPointer();
GLES20.glEnableVertexAttrib(location);

<font style="line-height: 40px;" color="Purple">6)uniform变量存取</font>

&nbsp; • &nbsp;在着色器中只不可改变
&nbsp; • &nbsp;通过GLES20.glGetUniformLoaction查询其在program中的索引
&nbsp; • &nbsp;通过GLES20.glUniformxxx函数为其赋值

<font style="line-height: 40px;" color="Purple">7)varying</font>

&nbsp; • &nbsp;一般在顶点着色器中赋值
&nbsp; • &nbsp;然后在后面的管线中使用,比如片元着色器和光栅化

<font style="line-height: 40px;" color="Purple">8)绘制三角形</font>

&nbsp; • &nbsp;编写顶点着色器
&nbsp; • &nbsp;编写片元着色器
&nbsp; • &nbsp;顶点数据赋值给顶点着色器变量
&nbsp; • &nbsp;颜色值赋值给片元着色器变量
&nbsp; • &nbsp;调用GLES20.glDrawArrays绘制
&nbsp; • &nbsp;调用GLES20.glSwapBuffers()渲染到屏幕(准确说是到帧缓冲区)

<font style="line-height: 40px;" color="Purple">9)绘制图像</font>

&nbsp; • &nbsp;生成纹理对象
&nbsp; • &nbsp;绑定纹理对象
&nbsp; • &nbsp;把图像数据赋值给纹理对象
&nbsp; • &nbsp;把此纹理对象赋值给片元着色器的sampler2D变量
&nbsp; • &nbsp;调用GLES20.glDrawArrays绘制
&nbsp; • &nbsp;调用GLES20.glSwapBuffers()渲染到屏幕(准确说是到帧缓冲区)

上面总结了Opengl ES基础的东西,后面会学习一些稍微高级的知识,比如VBO、FBO、纹理共享、摄像头渲染到多个Surface表面、投影以及Opengl ES中坐标系统及其转换。

本系列文章均为原创,主要总结作者多年在软件行业的一些经验,和大家共同学习、进步,转载请注明出处,谢谢!

来源:CSDN,作者:会说话的小鱼
原文:https://blog.csdn.net/china0851/article/details/85156180
版权声明:本文为博主原创文章,转载请附上博文链接!