{
1:獲取 Display
2:初始化 egl
3:選擇 Config
4:創建 Surface
5:創建上下文對象
6:查看 Display Surface Context 是否創建成功
7:繪製
8:銷燬 OpenGLES
}
#include <EGL/egl.h>
#include <gles2/gl2.h>
#include "freeImage/FreeImage.h"
class WinApp {
public:
WinApp(HINSTANCE hInstance);
virtual~WinApp(void);
virtual LRESULT onEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
int main(int wWidth,int wHegith);
bool configurationInit();
void draw();//畫
void destroy();//銷燬
private:
HINSTANCE _hInstance; //實例句柄
HWND _hWnd;//窗口句柄
protected;
int _width; // 視口寬度
int _height;// 視口高度
EGLDisplay _display;
EGLContext _context;
EGLSurface _surface;
EGLConfig _config;
};
#include "WinApp.h"
bool WinApp::configurationInit(){
//1:獲取 Display
_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
//2:初始化 egl
EGLint major;//返回主版本號
EGLint minor;//返回次版本號
eglInitialize(_display, &major, &minor);
//3:選擇 Config
const EGLint attribs[] ={
//屬性是一對一的初始化(類似與key->value)
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,//把數據畫到窗口上
EGL_BLUE_SIZE, 8,//R 佔8個比特位
EGL_GREEN_SIZE, 8,//G 佔8個比特位
EGL_RED_SIZE, 8, //B 佔8個比特位
EGL_DEPTH_SIZE,24,//深度值 佔24個比特位 畫圖的深度值 (前後順序的層)
EGL_NONE //這個機構結束了
};
EGLint format(0);
EGLint numConfigs(0);
//讓EGL爲你選擇一個配置
eglChooseConfig(_display, attribs, &_config, 1, &numConfigs);
//可以查詢某個配置的某個屬性
eglGetConfigAttrib(_display, _config, EGL_NATIVE_VISUAL_ID, &format);
4:創建 Surface
_surface = eglCreateWindowSurface(_display, _config, _hWnd, NULL);
//5:創建上下文對象
EGLint attr[] ={ EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, EGL_NONE };
//創建上下文對象
_context = eglCreateContext(_display, _config, EGL_NO_CONTEXT, attr);
//6:查看 Display Surface Context 是否創建成功
if (eglMakeCurrent(_display, _surface, _surface, _context) == EGL_FALSE){
return false;
}
//查詢Suface的屬性 獲取Suface中的寬高
eglQuerySurface(_display, _surface, EGL_WIDTH, &_width);
eglQuerySurface(_display, _surface, EGL_HEIGHT, &_height);
return true;
}
void WinApp::draw(){
//glDrawArrays(GL_TRIANGLE_STRIP,0,0);
glClearColor(0,0,1,1);//刷屏
//清除顏色GL_COLOR_BUFFER_BIT 和 清除深度值GL_DEPTH_BUFFER_BIT
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0,0,_width,_height);//繪製區域
//繪製
eglSwapBuffers(_display,_surface);
}
void WinApp::destroy(){
if (_display != EGL_NO_DISPLAY){//當前的Display 不等於null
//清楚綁定的 Surface Context
eglMakeCurrent(_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
if (_context != EGL_NO_CONTEXT){//不等於空Context
//銷燬上下文
eglDestroyContext(_display, _context);
}
if (_surface != EGL_NO_SURFACE){//不等於空Surface
//銷燬Surface
eglDestroySurface(_display, _surface);
}
//終止Dispay
eglTerminate(_display);
}
//把 Display Context Surface 設置成初始化
_display = EGL_NO_DISPLAY;
_context = EGL_NO_CONTEXT;
_surface = EGL_NO_SURFACE;
}
//---------------------窗口----------------------
WinApp::WinApp(HINSTANCE hInstance):_hInstance(hInstance){
WNDCLASSEX winClass;
winClass.lpszClassName = _T("CELLWinApp");//指向類名稱的指針(窗口名字)
winClass.cbSize = sizeof(winClass);//WNDCLASSEX 的大小
winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;//窗口風格
winClass.lpfnWndProc = wndProc;//窗口處理函數的指針
winClass.hInstance = hInstance;//本模塊的實例句柄
winClass.hIcon = 0;//圖標
winClass.hIconSm = 0;//和窗口類關聯的小圖標,如果該值爲NULL,則把hIcon中的圖標轉換成大小合適的小圖標
winClass.hCursor = LoadCursor(hInstance, IDC_ARROW);//鼠標句柄
winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//背景畫刷的句柄。
winClass.lpszMenuName = NULL;//指向菜單的指針
winClass.cbClsExtra = 0;
winClass.cbWndExtra = 0;
//1:註冊窗口
//隨後在調用Createwindow函數和CreatewindowEx函數中使用的窗口註冊一個窗口類。
RegisterClassEx(&winClass);
}
LRESULT CALLBACK WinApp::wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
//獲取窗口屬性
WinApp* pThis = (WinApp*)GetWindowLong(hWnd,GWL_USERDATA);
if (pThis) {
return pThis->onEvent(hWnd,msg,wParam,lParam);
}
if (WM_CREATE == msg){ //窗口創建完成時發來的消息
CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;
//獲取當前對象(CreateWindowEx函數中最後一個參數)
DWORD_PTR pCreateParams = (DWORD_PTR)pCreate->lpCreateParams;
/**設置窗口屬性
* @param HWND hWnd 窗口句柄
* @param int nlndex
* @param LONG dwNewLong
*/
SetWindowLong(hWnd,GWL_USERDATA,pCreateParams);
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
//事件函數
LRESULT WinApp::onEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch (msg){ //處理得到的消息
case WM_CLOSE://處理窗口關閉時的消息
case WM_DESTROY://銷燬
{
::PostQuitMessage(0);
}
break;
case WM_LBUTTONDOWN: //鼠標左鍵被按下的消息
break;
case WM_RBUTTONDOWN://鼠標右鍵被按下的消息
break;
case WM_MOUSEMOVE://鼠標移動
break;
case WM_KEYDOWN://監聽鍵盤按鍵
switch (wParam){
case VK_LEFT:
break;
default:
break;
}
break;
default:
return DefWindowProc( hWnd, msg, wParam, lParam );
}
return S_OK;
}
WinApp::~WinApp(void){
//註銷一個窗口類,類釋放所需的內存
UnregisterClass(_T("CELLWinApp"),_hInstance);
destroy();
}
int WinApp::main(int wWidth,int wHegith){
//2:創建窗口
//創建一個具有擴展風格的層疊式窗口、彈出式窗口或子窗口,其他與CreateWindow函數相同。關於創建窗口和其他參數的內容,請參看CreateWindow。
/**創建一個具有擴展風格的層疊式窗口、彈出式窗口或子窗口
* @param DWORD dwExStyle 窗口的擴展風格
* @param LPCWSTR lpClassName 指向註冊類名的指針
* @param LPCWSTR lpWindowName 指向窗口名稱的指針
* @param DWORD dwStyle 窗口風格
* @param int X 窗口的水平位置
* @param int Y 窗口的垂直位置
* @param int nWidth 窗口的寬度
* @param int nHeight 窗口的高度
* @param HWND hWndParent 父窗口的句柄
* @param HMENU hMenu 菜單的句柄或是子窗口的標識符
* @param HINSTANCE hInstance 應用程序實例的句柄
* @param LPVOID lpParam 指向窗口的創建數據
*/
_hWnd = CreateWindowEx( NULL, _T("CELLWinApp"), _T("CELLWinApp"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, wWidth, wHegith, NULL, NULL, _hInstance,this );
if (_hWnd == 0) {
return -1;
}
//3:更新顯示窗口
ShowWindow(_hWnd,SW_SHOW);//SW_MAXIMIZE 擴大窗口,SW_SHOW
configurationInit();
//4:消息循環
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{//無消息:則進行渲染繪製或睡眠
// Sleep(1);
draw();
}
}
return 0;
}
畫出一個藍色的界面就可以了