当前课程知识点:移动图形概论 > 第二章 图形编程入门 > 2.2 编写第一个图形程序 > 编写第一个图形程序
同学们 大家好
今天这节课我们要开始编写第一个openGLES程序
在今天的课程里面
我们将从一个最简单的绘制三角形的例子
来介绍OpenGLes的相关编程概念
其中还可以学习到PowerVRsdk的基本用法
掌握opengLES程序的基本流程与组成结构
这个示例代码可以在课程前面提到过的
github网站上面下载
本节介绍的是目录名为零零下划线hellopvr
目录中的程序
我们的第一个程序包含有四个源文件
它的主程序是helloPVR.cpp
这是里面唯一的C++代码原文件
另外还包括一个编译脚本
我们在里面使用的是Makefile
当然也可以采用cmakelist的方式
另外由于图形管线是可编程的
必须包含着色器的代码
其中顶点着色器程序是VertShader.vsh
片段着色器程序是Fragshader.fsh
在c++代码的最开始两行
是程序中所要包含的两个基本头文件
这两个头文件是所有的PowerVR代码中都要包含的
其中pvrshell提供了程序的主体框架支持
而另一个提供了openglES的杂项功能
用来简化程序的编写
例如这里面包含了对着色器程序的编译和加载
还包括了对纹理文件的加载
如果不使用powervr的工具
编写相关的代码还是比较复杂而且比较无趣的
Powervr的SDK又叫做powervr的框架结构
因为利用它编写程序的时候
都有一个固定的框架模式
接下来介绍的整个程序代码也体现了这个模式
我可以看一下右侧的代码
所有的使用PowerVR框架的程序都要定义一个类
这个类直接继承于pvr的Shell类
在这个类中要实现其中的五个虚函数
后面我们会对这五个函数分别进行介绍
为了程序设计方便
在这个类中还定义了三个自定义的私有成员变量
其中_context是EGL的实例句柄
用来实现EGL相关的操作
Program是着色器程序的句柄
而VBO是顶点数组的句柄
这些数据变量在后面都会用到
首先看一下initApplication这个虚函数
它在任何图形API初始化之前调用
可用于设置无需图形API调用的
任何应用程序数据
例如对象位置或状态初始化
需要了解的是此方法仅在程序最初运行时
和初始化图形上下文之前调用一次
因此
此处进行的任何图形API调用
都无法获得正确的效果
在我们的示例中
这个虚函数仅仅返回Success
表示执行成功
而initView这个方法在初始化图形API之后调用
可用于执行需要API功能的任何的其它初始化
它通常用于初始化依赖于渲染
上下文的变量和顶点缓冲区
只要确认上下文发生更改
就会调用此方法
因此任何图形api初始化的调用都应该在此处进行
下面我们来看一下
我们代码中的相关函数的实现
在这个函数中前两行首先初始化了_context
这个上下文参数
对图形窗口的显示和显示状态进行设置
这部分初始化基本上所有的代码都一致
接下来的四行代码用来将我们程序中
所使用的两个着色器程序进行编译并加载到GPU中
这里主要使用了createShaderProgram函数
它的参数比较复杂
其中包含了两个着色器程序的源文件名称
接下来的代码以此设置了窗口的背景颜色
设置了顶点数组的数据
定义了三个顶点的坐标值
可以看到这些坐标值都在-1和+1之间
同学们可以根据这些值想象一下这个三角形的样子
接下来的三行代码
分别建立了顶点缓冲区
绑定缓冲区
并把顶点缓存区的数据存储到GPU中
最后两行代码把顶点缓存区解绑并返回成功
接下来是renderFrame函数
这个函数是程序的主渲染循环
将反复的调用来执行几何绘制操作
每次绘制都会对屏幕进行更新
在这部分代码中首先清除当前的颜色缓冲区
然后指定当前运行的程序再绑定顶点缓冲区
接下来两行代码分别使能顶点数据
并指定顶点数据的指针
然后执行DrawArray命令将三角形绘制出来
接下来释放顶点缓冲区的绑定
倒数第二行的程序用swapBuffer
将缓冲器绘制的数据显示在屏幕上
这里使用了双缓冲技术
当前绘制的内容和屏幕显示的内容
是两个不同的缓冲区
这样可以保证屏幕上不会显示出
绘制一半的半成品图形
releaseView是在释放图形API之前
用于释放任何API资源
例如释放在初始化方法中分配的资源
在我们的代码中
它首先删除了顶点数组中的数据
然后释放着色器代码占用的内存
最后返回成功
最后一个函数是quitApplication
它在程序的最后调用
也就是释放图形API使用之后调用
可用于释放任何剩余的用户分配的存储器资源
例如在初始化程序中分配的存储器
比如在我们的示例中初始化部分
就没有分配任何的资源
所以这里也是简单的返回成功
另外框架结构还要求我们实现一个newDemo函数
用来实例化程序中建立的类
它拥有固定的调用格式
就如我们下面的示例这样
在newDemo函数中返回一个指向新建类的指针
以上就是全部的cpp代码
可以看到这里边甚至没有main函数
只是要把这个继承的类实现完整就可以了
接下来我们看一下两个着色器程序的代码
这两个代码也都非常简单
先看一下顶点着色器
第一行代码中指定了一个输入参数
也就是程序中的顶点数组
这个在后面也会有详细的介绍
然后主程序中就一行代码
将顶点数组的坐标直接传递给了
gl_Position 这个变量
它就是传递给后续管线的NDC坐标
片段着色器的代码也非常简单仅有一行
就是指定每一个片段也就是像素的颜色
这里边指定了一个固定的值
程序编译以后我们可以看到程序的运行结果
它和我们在安装SDK课程中运行的那个示例是类似的
在蓝色的背景下显示了一个黄色的三角形。
今天的课就到这里
谢谢大家
-1.1 课程基本情况介绍
--课程基本情况介绍
-1.2 GPU 相关基础知识
-1.3 OpenGL ES 技术发展历史
-1.4 PowerVR SDK 安装和使用
-第一章测试
-2.1 OpenGL ES 基本概念
-2.2 编写第一个图形程序
-2.3 主要 API 介绍
-第二章测试
-3.1 矢量和矩阵知识基础
-3.2 旋转与位移变换
--旋转与位移变换
-3.3 OpenGL ES 变换基础
-第三章测试
-4.1 着色器编程语言介绍
-4.2 着色器编程实例
--着色器编程实例
-第四章测试
-5.1 颜色的基本概念
--颜色的基本概念
-5.2 纹理素材的使用
--纹理素材的使用
-5.3 立方体纹理
--立方体纹理
-第五章测试
-6.1 光照的基本概念
--光照的基本概念
-6.2 光源模型
--光源模型
-6.3 使用着色器渲染颜色
-6.4 反射与折射
--反射与折射
-第六章测试
-7.1 基于物理渲染的基本概念
-7.2 基于图像的照明
--基于图像的照明
-7.3 PBR 的实现
--PBR 的实现
-第七章测试
-8.1 Vulkan 介绍
-8.2 SDK 中的实用工具介绍
-综合测试