当前课程知识点:移动图形概论 >  第二章 图形编程入门 >  2.2 编写第一个图形程序 >  编写第一个图形程序

返回《移动图形概论》慕课在线视频课程列表

编写第一个图形程序在线视频

下一节:主要 API 介绍

返回《移动图形概论》慕课在线视频列表

编写第一个图形程序课程教案、知识点、字幕

同学们 大家好

今天这节课我们要开始编写第一个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 相关基础知识

--GPU 相关基础知识

-1.3 OpenGL ES 技术发展历史

--OpenGL ES 技术发展历史

-1.4 PowerVR SDK 安装和使用

--PowerVR SDK 安装和使用

-第一章测试

第二章 图形编程入门

-2.1 OpenGL ES 基本概念

--OpenGL ES 基本概念

-2.2 编写第一个图形程序

--编写第一个图形程序

-2.3 主要 API 介绍

--主要 API 介绍

-第二章测试

第三章 OpenGL ES 变换

-3.1 矢量和矩阵知识基础

--矢量和矩阵知识基础

-3.2 旋转与位移变换

--旋转与位移变换

-3.3 OpenGL ES 变换基础

--OpenGL ES 变换基础

-第三章测试

第四章 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 的实现

-第七章测试

第八章 PowerVR 工具简介

-8.1 Vulkan 介绍

--Vulkan 介绍

-8.2 SDK 中的实用工具介绍

--SDK 中的实用工具介绍

-综合测试

编写第一个图形程序笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。