opengl es三角形例子

一点小说明,稍微介绍一下
如果你正在寻找opengl es方面的资料,并且希望能够入门,这片博客恐怕是你遇到的最清楚的入门级资料了。闲话说多了没有用,介绍这里我就说明两点。

  1. opengl es 里面 gl, egl和平台窗口的关系
opengl es通过egl和平台窗口产生交互
2.看懂这篇博客需要那么一点基础知识
基本的win32编程,懂那么点opengl知识,框架就是一个gles如何显示到win32窗口的,嗯,来吧,让我们搞起~
实战导练
  1. 创建基本的win32窗口程序
    就是最基本的win32程序,这个其实最简单了,vs里面文件->新建->工程->visual c++->win32 工程,然后编译运行,嗯看起来是这个样子,如果你和我的不是很一样,证明你没有最基本的win32知识,需要补补~
    opengl es三角形例子
    文章图片

我们需要配置一下opengl es环境
需要 3.5个方面啦。
0.5 你需要下载一个模拟器,因为是windows平台, 我下载的是AMD模拟器 2.0的,看起来是这样子的
opengl es三角形例子
文章图片

这个自己网上找吧,我也是网上找的,安装好看起来是这样子的
opengl es三角形例子
文章图片

注意看路径
1 配置包含路径
这个基本功啦, 工程右键属性->c/c++->general->addtional include dictionary 添加上模拟器的include路径,看起来是这样子的
opengl es三角形例子
文章图片

2.引用库路径
照样是基本功
工程属性->linker->general->addtional library dictionaries
添加lib目录看起来是这样子的
opengl es三角形例子
文章图片

3加上引用库
工程属性->linker->input->addtional dependecies
看起来这样子的
opengl es三角形例子
文章图片

创建我们的opengl es控制类
为了避免很多讲图形编程说的全局变量,我们整成单例模式的控制类,看起来是这样子的。
切换到类视图,然后呢,创建类EGLView 添加那么点方法,现在都是空的。
bool Init(HWND hWnd) // egl需要窗口句柄
void Tick();
void Render();
void Release();
static EGLView* GetInstance();
做完这一步看起来貌似是这样样子的,因为一点有用的代码也还没写,所以心情很放松,放松~
opengl es三角形例子
文章图片

写那么点有用的代码,做做框架
我们win32里面有那么一个窗口回调函数,在窗口回调函数里
WM_PAINT消息处理里面 添加 view Render代码
WM_DESTROY消息处理里面 添加 view Release代码
看起来这样子的
opengl es三角形例子
文章图片

当然了,整这些肯定得包含view类头文件啦,看起来是这样子的~
opengl es三角形例子
文章图片

这个是包含view头文件代码。
是不是感觉缺少点什么呢,是的,缺少初始化。
那么我们添加上他,框架就基本上搭建好啦,
看起来这样子添加上初始化
opengl es三角形例子
文章图片

这样框架就算搭建完啦,运行的话其实还是基本的项目,我们没有动什么东西,不过呢,我们可以离开编辑器生成的那一堆代码了,因为看着繁琐,不利于我们讲解。
再说那么一下egl和gl还有win32
egl是gl和win32交互的接口,所以千万别把egl和gl搞混了,他们不是一个东西,egl的函数和数据类型以egl开头,gl以gl开头,至于win32,鬼才能总结出来。我们接下来继续实现我们的eglview。
【opengl es三角形例子】先来简单的 添加基本的egl变量
添加完再说吧 ,看着图说感觉比较好呢
opengl es三角形例子
文章图片

前面包含一堆头文件不用怎么说吧,这个就是导入egl和gl的意思,后面来tool基本上任何做库的都会来一个tool目录扩展用的。嗯,接下来我定义了一个宏,这个宏是说最多利用egl 64个属性的意思。
四个变量 这个倒是好说了
display egl显示屏幕 或者叫做显示内容的地方
config egl的配置
context egl显示图像的上下文,还是egl
surface egl显示表层,可以理解为窗口面吧,看自己翻译了,表面。
先从最简单的函数说起 GetInstance()
这个函数就是单例模式实现最标准的形式啦。
opengl es三角形例子
文章图片

接下来第二个简单的就是 嗯 释放
我们从表面释放到里面 再从里面释放到外面 就这点
opengl es三角形例子
文章图片

释放上下文 释放表皮 释放 额 停止egl程序 记住都是egl不是 gl哟
为了简单版本我们来一个简单版本额绘制
先为了增加点信心,搞一个最普通的绘制
opengl es三角形例子
文章图片

就三行代码 ,不过我只解释一遍
说我要把颜色清除成这个样子的 【rgb蓝色】
gl说我给你请了颜色啦
然后呢 清出的结果呢 显示出来看看。到表皮看 那就到了窗口看啦。
哎呀 貌似还丢下一个函数呢 初始化
opengl es三角形例子
文章图片

opengl es三角形例子
文章图片

为了连贯我整两个截图,很不开心字体不一般大,不过能看清楚就好啦。这下说多了 还是写注释吧
bool EGLView::Init(HWND hWnd, int width, int height) { //创建出egl 显示器来 m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); if (m_eglDisplay == EGL_NO_DISPLAY) { return false; }//初始化正确的egl版本 EGLint majorVersion; EGLint minorVersion; if (!eglInitialize(m_eglDisplay, &majorVersion, &minorVersion)) { return false; }// 获取支持的egl配置 EGLint nConfigs; if (!eglGetConfigs(m_eglDisplay, NULL, 0, &nConfigs)) { return false; }// 我们能用到这些配置 并且用上 EGLint attrs[MAX_EGL_ATTRIBUTES] = {0}; int attrIdx = 0; attrs[attrIdx++] = EGL_RED_SIZE; attrs[attrIdx++] = 5; attrs[attrIdx++] = EGL_GREEN_SIZE; attrs[attrIdx++] = 6; attrs[attrIdx++] = EGL_BLUE_SIZE; attrs[attrIdx++] = 5; attrs[attrIdx++] = EGL_ALPHA_SIZE; attrs[attrIdx++] = 0; attrs[attrIdx++] = EGL_DEPTH_SIZE; attrs[attrIdx++] = 16; attrs[attrIdx++] = EGL_STENCIL_SIZE; attrs[attrIdx++] = 0; attrs[attrIdx++] = EGL_SAMPLES; attrs[attrIdx++] = 4; attrs[attrIdx++] = EGL_NONE; if (!eglChooseConfig(m_eglDisplay, attrs, &m_eglConfig,1,&nConfigs)) { return false; }//创建窗口表皮 表面 m_eglSurface = eglCreateWindowSurface( m_eglDisplay, m_eglConfig, NativeWindowType(hWnd), NULL); if (m_eglSurface == EGL_NO_SURFACE) { return false; }//创建egl上下文 EGLint ctxAttr[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; m_eglContext = eglCreateContext(m_eglDisplay, m_eglConfig, EGL_NO_CONTEXT, ctxAttr); if (m_eglContext == EGL_NO_CONTEXT) { return false; }//好了 egl准备好了 以后画的东西都是egl控制啦 if (!eglMakeCurrent(m_eglDisplay, m_eglSurface, m_eglSurface, m_eglContext)) { return false; }return true; }

是不是注释写的egl控制了呢 我们看看效果 运行一下试试呗
opengl es三角形例子
文章图片

我靠 要不要这么好看 全是篮板~ 是不是信心满满的了 好的 我们继续装逼~
逼格的提升就是我要有着色器,画数据
继续写,我们把view头文件再修改那么一下,看起来如此
opengl es三角形例子
文章图片

主要是创建了两个函数,加了点变量。
gl program 和 glshader,这里说一下 init里面将新添加的width和height赋值。
嗯再看一下实现文件的变化
构造函数整点数据
opengl es三角形例子
文章图片

init里面整点赋值和调用initprogram
opengl es三角形例子
文章图片

opengl es三角形例子
文章图片

还有呢
opengl es三角形例子
文章图片

创建program
opengl es三角形例子
文章图片

创建shader
opengl es三角形例子
文章图片

程序整完了 最后两张图片是最难的需要你的gl基础了。
运行结果这样子的
opengl es三角形例子
文章图片

是不是很好看呢~ 这事opengl es呀
总结那么一下下
最后解释的不是很清楚 主要是 创建glprogram和 glshader,不懂的留言问吧,代码都有就是啦~

    推荐阅读