当前位置: 首页 > article >正文

Opengl es2.0 学习笔记(一)初始化

文章目录

    • 一、vs使用opengles2.0
    • 二、初始化所用到的API
    • 三、撸代码
    • 四、创建错误


官网
http://khronos.org/bugzilla


一、vs使用opengles2.0

1. 下载库区分x86 x64
2. C++ ->常规->包含目录->include文件夹
3. 链接器->附加依赖项:libEGL.lib,libGLESv2.lib
4. 链接器->常规->附加库目录
5. opengl es没有windows实现,angular提供了windows版 windows平台调用direct3D 需要copy这两个库扔到debug下 d3dcompiler_43.dll d3dcompiler_46.dll

二、初始化所用到的API

//创建display返回display
eglGetDisplay(EGLNativeDisplayType display_id);//初始化egl
eglInitialize//选择config
eglChooseConfig//根据conig获取format
eglGetConfigAttrib//创建surface
eglCreateWindowSurface
//创建上下文
eglCreateContext
//关联起来
eglMakeCurrent
//查询宽度高度
eglQuerySurface//使用rgba清空缓冲区的颜色
glClearColor(1,0,0,1);
//! 清空缓冲区
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
//! 视口,在Windows窗口指定的位置和大小上绘制OpenGL内容
glViewport(0,0,_width,_height);
​				
//双缓冲,把缓冲区内容贴到屏幕上			
eglSwapBuffers(_display,_surface);
//销毁display
eglTerminate
//销毁上下文eglDestroyContext
//销毁surfaceeglDestroySurface

三、撸代码

#include "CELLWinApp.hpp"int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR    lpCmdLine,int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(hInstance);UNREFERENCED_PARAMETER(lpCmdLine);UNREFERENCED_PARAMETER(nCmdShow);CELL::CELLWinApp  app(hInstance);app.main(800,600);return 0;
}
#pragma once#include <Windows.h>
#include <tchar.h>#include <EGL/egl.h>
#include <gles2/gl2.h>namespace   CELL
{class   CELLWinApp{public://! 实例句柄HINSTANCE   _hInstance;//! 窗口句柄HWND        _hWnd;//! 窗口的高度int         _width;//! 窗口的宽度int         _height;/// for gles2.0EGLConfig   _config;EGLSurface  _surface;EGLContext  _context;EGLDisplay  _display;public:CELLWinApp(HINSTANCE hInstance):_hInstance(hInstance){WNDCLASSEX  winClass;winClass.lpszClassName  =   _T("CELLWinApp");winClass.cbSize         =   sizeof(winClass);winClass.style          =   CS_HREDRAW | CS_VREDRAW | CS_OWNDC;winClass.lpfnWndProc    =   wndProc;winClass.hInstance      =   hInstance;winClass.hIcon	        =   0;winClass.hIconSm	    =   0;winClass.hCursor        =   LoadCursor(hInstance, IDC_ARROW);winClass.hbrBackground  =   (HBRUSH)GetStockObject(BLACK_BRUSH);winClass.lpszMenuName   =   NULL;winClass.cbClsExtra     =   0;winClass.cbWndExtra     =   0;RegisterClassEx(&winClass);}virtual ~CELLWinApp(){UnregisterClass(_T("CELLWinApp"),_hInstance);}/***   初始化 OpenGLES2.0*/bool    initOpenGLES20(){const EGLint attribs[] ={//surrface   画在窗口上EGL_SURFACE_TYPE, EGL_WINDOW_BIT,EGL_BLUE_SIZE, 8,	//b 8位EGL_GREEN_SIZE, 8,	//g 8位EGL_RED_SIZE, 8,	//r 8位EGL_DEPTH_SIZE,24,//深度24位EGL_NONE//};EGLint 	format(0);EGLint	numConfigs(0);EGLint  major;EGLint  minor;//! 1_display	    =	eglGetDisplay(EGL_DEFAULT_DISPLAY);//! 2initeglInitialize(_display, &major, &minor);//! 3eglChooseConfig(_display, attribs, &_config, 1, &numConfigs);eglGetConfigAttrib(_display, _config, EGL_NATIVE_VISUAL_ID, &format);//! 4 _surface	    = 	eglCreateWindowSurface(_display, _config, _hWnd, NULL);//! 5EGLint attr[]   =   { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, EGL_NONE };_context 	    = 	eglCreateContext(_display, _config, 0, attr);//! 6if (eglMakeCurrent(_display, _surface, _surface, _context) == EGL_FALSE){return false;}eglQuerySurface(_display, _surface, EGL_WIDTH,  &_width);eglQuerySurface(_display, _surface, EGL_HEIGHT, &_height);return  true;}/***   销毁OpenGLES2.0*/void    destroyOpenGLES20(){if (_display != EGL_NO_DISPLAY){eglMakeCurrent(_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);if (_context != EGL_NO_CONTEXT) {eglDestroyContext(_display, _context);}if (_surface != EGL_NO_SURFACE) {eglDestroySurface(_display, _surface);}eglTerminate(_display);}_display    =   EGL_NO_DISPLAY;_context    =   EGL_NO_CONTEXT;_surface    =   EGL_NO_SURFACE;}protected:static  LRESULT CALLBACK wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){CELLWinApp*  pThis   =   (CELLWinApp*)GetWindowLong(hWnd,GWL_USERDATA);if (pThis){return  pThis->onEvent(hWnd,msg,wParam,lParam);}if (WM_CREATE == msg){CREATESTRUCT*   pCreate =   (CREATESTRUCT*)lParam;SetWindowLong(hWnd,GWL_USERDATA,(DWORD_PTR)pCreate->lpCreateParams);}return  DefWindowProc( hWnd, msg, wParam, lParam );}public:/***   事件函数*/virtual LRESULT onEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){switch (msg){case WM_CLOSE:case WM_DESTROY:{::PostQuitMessage(0);}break;case WM_MOUSEMOVE:break;default:return  DefWindowProc( hWnd, msg, wParam, lParam ); }return  S_OK;}/***   绘制函数*/virtual void    render(){glClearColor(1,0,0,1);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glViewport(0,0,_width,_height);}/***   主函数*/int     main(int width,int height){//创建窗口句柄_hWnd   =   CreateWindowEx( NULL,_T("CELLWinApp"),_T("CELLWinApp"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,width,height, NULL, NULL,_hInstance, this);if (_hWnd == 0){return  -1;}//显示窗口ShowWindow(_hWnd,SW_SHOW);//初始化opengl es2.0if (!initOpenGLES20()){return  false;}MSG msg =   {0};while(msg.message != WM_QUIT){if (msg.message == WM_DESTROY || msg.message == WM_CLOSE){break;}/***   有消息,处理消息,无消息,则进行渲染绘制*/if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ){ TranslateMessage( &msg );DispatchMessage( &msg );}else{render();eglSwapBuffers(_display,_surface);}}/***   销毁OpenGLES20*/destroyOpenGLES20();return  0;}};
}

四、创建错误


–error LNK2019: 无法解析的外部符号 _main,该符号在函数___tmainCRTStartup 中被引用_

1.进入project->setting->c/c++,在category中选择preprocessor,在processor definitions中删除_CONSOLE,添加_WINDOWS
2.进入project->setting->Link, 在Projectoptions(子系统)中将 /subsystem:console改为/subsystem:windows.
3.保存设置,Rebuild All.


–找不到 #include <EGL/egl.h> #include <gles2/gl2.h>文件

C+±>常规->包含目录->include文件夹存在问题,请检查


–无法启动

debug下,没扔这两个库
d3dcompiler_43.dll
d3dcompiler_46.dll


–找不到libEGL.lib
–找不到libGLESv2.lib

链接器->附加依赖项:libEGL.lib,libGLESv2.lib
链接器->常规->附加库目录 这两步存在问题


http://www.lryc.cn/news/2418627.html

相关文章:

  • Android studio4.1 构建项目遇到的一些问题总结
  • 诺基亚808 PureView
  • Ubuntu10.04下载与安装
  • 浏览器安全之网页挂马实战 ——合天网安实验室学习笔记
  • Apple的山狮(Mountain Lion)
  • 分享88个企业政府PHP源码,总有一款适合你
  • 飞腾固件在线更新
  • Eclipse篇
  • 汇编堆栈平衡的几种方式
  • 计算机表演活动全国,威盛中国芯计算机表演赛启动线下活动
  • Java项目:手机商城系统(java+Springboot+SSM+HTML+Layui+thymeleaf+mysql)
  • 云计算与虚拟化技术详解
  • canvas绘制简单动画和本地储存
  • WinForm中常用控件
  • Discuz!教程之Discuz!X2.5版本安装一些插件显示500错误,或页面打不开的问题修复
  • 新浪微博开放平台深度历险
  • ipad air1 12.5.5 checkra1n 越狱+绕过ID
  • JAVA代码优化:记录日志
  • 不得不使用的百度快照优化seo技巧
  • Zblog主题模板:Zblog响应式CMS轻主题博客模板
  • Android 客户端起HttpServer NanoHttpd
  • SQLServer · BUG分析 · Agent 链接泄露分析(转载)
  • ibmt41 安装linux系统,哥我决意为IBM T41 装WIN7的决心已经到了全人类都无法阻止的地步!...
  • struts2 通配符的配置方式
  • sobel算子
  • mac/linux--终端光标的快捷键操作
  • 【转】nios II架构uclinux的过程
  • 10个免费视频通话网站与陌生人聊天
  • 计算机毕业设计 asp.net校园论坛 毕设
  • oracle数据库查看归档日志文件,oracle的归档模式 ORACLE数据库归档日志常用命令...