opengl es三角形例子

来源:互联网 发布:q扫雷软件 编辑:程序博客网 时间:2024/05/16 15:12

一点小说明,稍微介绍一下
如果你正在寻找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环境
需要 3.5个方面啦。
0.5 你需要下载一个模拟器,因为是windows平台, 我下载的是AMD模拟器 2.0的,看起来是这样子的
这里写图片描述
这个自己网上找吧,我也是网上找的,安装好看起来是这样子的
这里写图片描述
注意看路径

1 配置包含路径
这个基本功啦, 工程右键属性->c/c++->general->addtional include dictionary 添加上模拟器的include路径,看起来是这样子的

这里写图片描述

2.引用库路径
照样是基本功
工程属性->linker->general->addtional library dictionaries
添加lib目录看起来是这样子的
这里写图片描述
3加上引用库
工程属性->linker->input->addtional dependecies
看起来这样子的

这里写图片描述

创建我们的opengl es控制类
为了避免很多讲图形编程说的全局变量,我们整成单例模式的控制类,看起来是这样子的。
切换到类视图,然后呢,创建类EGLView 添加那么点方法,现在都是空的。
bool Init(HWND hWnd) // egl需要窗口句柄
void Tick();
void Render();
void Release();
static EGLView* GetInstance();

做完这一步看起来貌似是这样样子的,因为一点有用的代码也还没写,所以心情很放松,放松~
第二步

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

当然了,整这些肯定得包含view类头文件啦,看起来是这样子的~
包含
这个是包含view头文件代码。
是不是感觉缺少点什么呢,是的,缺少初始化。
那么我们添加上他,框架就基本上搭建好啦,
看起来这样子添加上初始化
这里写图片描述
这样框架就算搭建完啦,运行的话其实还是基本的项目,我们没有动什么东西,不过呢,我们可以离开编辑器生成的那一堆代码了,因为看着繁琐,不利于我们讲解。

再说那么一下egl和gl还有win32

egl是gl和win32交互的接口,所以千万别把egl和gl搞混了,他们不是一个东西,egl的函数和数据类型以egl开头,gl以gl开头,至于win32,鬼才能总结出来。我们接下来继续实现我们的eglview。

先来简单的 添加基本的egl变量
添加完再说吧 ,看着图说感觉比较好呢
这里写图片描述
前面包含一堆头文件不用怎么说吧,这个就是导入egl和gl的意思,后面来tool基本上任何做库的都会来一个tool目录扩展用的。嗯,接下来我定义了一个宏,这个宏是说最多利用egl 64个属性的意思。
四个变量 这个倒是好说了
display egl显示屏幕 或者叫做显示内容的地方
config egl的配置
context egl显示图像的上下文,还是egl
surface egl显示表层,可以理解为窗口面吧,看自己翻译了,表面。

先从最简单的函数说起 GetInstance()
这个函数就是单例模式实现最标准的形式啦。
这里写图片描述

接下来第二个简单的就是 嗯 释放

我们从表面释放到里面 再从里面释放到外面 就这点

这里写图片描述

释放上下文 释放表皮 释放 额 停止egl程序 记住都是egl不是 gl哟

为了简单版本我们来一个简单版本额绘制
先为了增加点信心,搞一个最普通的绘制

这里写图片描述

就三行代码 ,不过我只解释一遍

说我要把颜色清除成这个样子的 【rgb蓝色】
gl说我给你请了颜色啦

然后呢 清出的结果呢 显示出来看看。到表皮看 那就到了窗口看啦。

哎呀 貌似还丢下一个函数呢 初始化
这里写图片描述
这里写图片描述

为了连贯我整两个截图,很不开心字体不一般大,不过能看清楚就好啦。这下说多了 还是写注释吧

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控制了呢 我们看看效果 运行一下试试呗

这里写图片描述
我靠 要不要这么好看 全是篮板~ 是不是信心满满的了 好的 我们继续装逼~

逼格的提升就是我要有着色器,画数据

继续写,我们把view头文件再修改那么一下,看起来如此
这里写图片描述

主要是创建了两个函数,加了点变量。
gl program 和 glshader,这里说一下 init里面将新添加的width和height赋值。

嗯再看一下实现文件的变化

构造函数整点数据
这里写图片描述

init里面整点赋值和调用initprogram
这里写图片描述
这里写图片描述

还有呢
这里写图片描述

创建program
这里写图片描述
创建shader
这里写图片描述

程序整完了 最后两张图片是最难的需要你的gl基础了。

运行结果这样子的
这里写图片描述

是不是很好看呢~ 这事opengl es呀
总结那么一下下

最后解释的不是很清楚 主要是 创建glprogram和 glshader,不懂的留言问吧,代码都有就是啦~

0 0
原创粉丝点击