openglesForC++矩形旋转
来源:互联网 发布:python绝技 pdf 中文 编辑:程序博客网 时间:2024/05/19 07:08
shader实现类
#pragma once#include <assert.h>class ShaderId{public:ShaderId(){_shaderId = -1;}int _shaderId;};/*** 程序*/class ProgramId{public:int _programId;ShaderId _vertex;ShaderId _fragment;public:ProgramId(){_programId = -1;}public:/*** 加载函数*/bool createProgram(const char* vertex, const char* fragment){bool error = false;do{if (vertex){_vertex._shaderId = glCreateShader(GL_VERTEX_SHADER);glShaderSource(_vertex._shaderId, 1, &vertex, 0);glCompileShader(_vertex._shaderId);GLint compileStatus;glGetShaderiv(_vertex._shaderId, GL_COMPILE_STATUS, &compileStatus);error = compileStatus == GL_FALSE;if (error){GLchar messages[256];glGetShaderInfoLog(_vertex._shaderId, sizeof(messages), 0, messages);assert(messages && 0 != 0);break;}}if (fragment){_fragment._shaderId = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(_fragment._shaderId, 1, &fragment, 0);glCompileShader(_fragment._shaderId);GLint compileStatus;glGetShaderiv(_fragment._shaderId, GL_COMPILE_STATUS, &compileStatus);error = compileStatus == GL_FALSE;if (error){GLchar messages[256];glGetShaderInfoLog(_fragment._shaderId, sizeof(messages), 0, messages);assert(messages && 0 != 0);break;}}_programId = glCreateProgram();if (_vertex._shaderId){glAttachShader(_programId, _vertex._shaderId);}if (_fragment._shaderId){glAttachShader(_programId, _fragment._shaderId);}glLinkProgram(_programId);GLint linkStatus;glGetProgramiv(_programId, GL_LINK_STATUS, &linkStatus);if (linkStatus == GL_FALSE){GLchar messages[256];glGetProgramInfoLog(_programId, sizeof(messages), 0, messages);break;}glUseProgram(_programId);} while (false);if (error){if (_fragment._shaderId){glDeleteShader(_fragment._shaderId);_fragment._shaderId = 0;}if (_vertex._shaderId){glDeleteShader(_vertex._shaderId);_vertex._shaderId = 0;}if (_programId){glDeleteProgram(_programId);_programId = 0;}}return true;}/*** 使用程序*/virtual void begin(){glUseProgram(_programId);}/*** 使用完成*/virtual void end(){glUseProgram(0);}};class PROGRAM_P2_AC4 :public ProgramId{public:typedef int attribute;typedef int uniform;public:attribute _position;attribute _color;uniform _MVP;public:PROGRAM_P2_AC4(){_position = -1;_color = -1;_MVP = -1;}~PROGRAM_P2_AC4(){}/// 初始化函数virtual bool initialize(){const char* vs ={"precision lowp float; ""uniform mat4 _MVP;""attribute vec2 _position;""attribute vec4 _color;""varying vec4 _outColor;""void main()""{"" vec4 pos = vec4(_position,0,1);"" _outColor = _color;"" gl_Position = _MVP * pos;""}"};const char* ps ={"precision lowp float; ""varying vec4 _outColor;""void main()""{"" gl_FragColor = _outColor;""}"};bool res = createProgram(vs, ps);if (res){_position = glGetAttribLocation(_programId, "_position");_color = glGetAttribLocation(_programId, "_color");_MVP = glGetUniformLocation(_programId, "_MVP");}return res;}/*** 使用程序*/virtual void begin(){glUseProgram(_programId);glEnableVertexAttribArray(_position);glEnableVertexAttribArray(_color);}/*** 使用完成*/virtual void end(){glDisableVertexAttribArray(_position);glDisableVertexAttribArray(_color);glUseProgram(0);}};class PROGRAM_P2_C4 :public ProgramId{public:typedef int attribute;typedef int uniform;public:attribute _position;uniform _color;uniform _MVP;public:PROGRAM_P2_C4(){_position = -1;_color = -1;_MVP = -1;}~PROGRAM_P2_C4(){}/// 初始化函数virtual bool initialize(){const char* vs ={"precision lowp float; ""uniform mat4 _MVP;""attribute vec2 _position;""void main()""{"" vec4 pos = vec4(_position,0,1);"" gl_Position = _MVP * pos;""}"};const char* ps ={"precision lowp float; ""uniform vec4 _color;""void main()""{"" gl_FragColor = _color;""}"};bool res = createProgram(vs, ps);if (res){_position = glGetAttribLocation(_programId, "_position");_color = glGetUniformLocation(_programId, "_color");_MVP = glGetUniformLocation(_programId, "_MVP");}return res;}/*** 使用程序*/virtual void begin(){glUseProgram(_programId);glEnableVertexAttribArray(_position);}/*** 使用完成*/virtual void end(){glDisableVertexAttribArray(_position);glUseProgram(0);}};
窗口实现类
#pragma once#include <Windows.h>#include <tchar.h>#include <math.h>#include <EGL/egl.h>#include <gles2/gl2.h>#include "freeImage/FreeImage.h"#include "CELLMath.hpp"#include "CELLShader.hpp"namespace CELL{class CELLWinApp{public://! 实例句柄HINSTANCE _hInstance;//! 窗口句柄HWND _hWnd;//! 窗口的高度int _width;//! 窗口的宽度int _height;/// for gles2.0EGLConfig _config;EGLSurface _surface;EGLContext _context;EGLDisplay _display;//! 增加shaderPROGRAM_P2_AC4 _shader;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[] ={EGL_SURFACE_TYPE, EGL_WINDOW_BIT,EGL_BLUE_SIZE, 8,EGL_GREEN_SIZE, 8,EGL_RED_SIZE, 8,EGL_DEPTH_SIZE, 24,EGL_NONE};EGLint format(0);EGLintnumConfigs(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 renderV1(){struct Vertex{CELL::float2 pos;CELL::Rgba4Byte color;};//! 清空缓冲区glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);//! 视口,在Windows窗口指定的位置和大小上绘制OpenGL内容glViewport(0, 0, _width, _height);//! 创建一个投影矩阵CELL::matrix4 screenProj = CELL::ortho<float>(0, float(_width), float(_height), 0, -100.0f, 100);_shader.begin();{float x = 100;float y = 100;float w = 100;float h = 100;Vertex vertex[] ={CELL::float2(x, y), CELL::Rgba4Byte(255, 0, 0, 255),CELL::float2(x + w, y), CELL::Rgba4Byte(0, 255, 0, 255),CELL::float2(x, y + h), CELL::Rgba4Byte(0, 0, 255, 255),CELL::float2(x + w, y + h), CELL::Rgba4Byte(255, 255, 255, 255),};static float inc = 1;#if 1CELL::matrix4 matRot;CELL::matrix4 matTran;CELL::matrix4 matTran1;matTran.translate(-150, -150, 0);matTran1.translate(150, 150, 0);inc += 1;matRot.rotateZ(inc);CELL::matrix4 matModel = matTran1 * (matRot* matTran);CELL::matrix4 matMVP = screenProj * matModel;#elseinc += 1;CELL::quaternion quat = CELL::angleAxis(inc, CELL::float3(0, 0, 1));//绕Z轴旋转 inc度//三个参数分别表示平移,缩放,旋转CELL::matrix4 matModel = CELL::makeTransform(CELL::float3(0, 0, 0), CELL::float3(1, 1, 1), quat);CELL::matrix4 matMVP = screenProj * matModel;#endifglUniformMatrix4fv(_shader._MVP, 1, false, matMVP.data());glVertexAttribPointer(_shader._position, 2, GL_FLOAT, false, sizeof(Vertex), vertex);glVertexAttribPointer(_shader._color, 4, GL_UNSIGNED_BYTE, true, sizeof(Vertex), &vertex[0].color);glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);#if 0Vertex circle[362];float xCenter = 200;float yCenter = 200;float radius = 200;circle[0].pos = CELL::float2(xCenter, yCenter);circle[0].color = CELL::Rgba4Byte(255, 0, 0);for (size_t i = 0; i <= 360; ++i){float x = xCenter + radius * cos(float(i) * PI / 180.0f);float y = yCenter + radius * sin(float(i) * PI / 180.0f);circle[i + 1].pos = CELL::float2(x, y);}glVertexAttribPointer(_shader._position, 2, GL_FLOAT, false, sizeof(Vertex), circle);glVertexAttribPointer(_shader._color, 4, GL_UNSIGNED_BYTE, true, sizeof(Vertex), &circle[0].color);glDrawArrays(GL_TRIANGLE_FAN, 0, 362);#endif}_shader.end();}virtual void renderV2(){struct Vertex{CELL::float2 pos;CELL::Rgba4Byte color;};//清空缓冲区glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);//设置视口,在window窗口指定的位置和大小上绘制opengl内容glViewport(0, 0, _width, _height);//创建一个投影矩阵CELL::matrix4 screenProj = CELL::ortho<float>(0, float(_width), float(_height), 0, -100.0f, 100);_shader.begin();{float x = 100;float y = 100;float w = 100;float h = 100;Vertex vertex[]={CELL::float2(x, y), CELL::Rgba4Byte(255,0,0,255),CELL::float2(x + w, y), CELL::Rgba4Byte(0,255,0,255),CELL::float2(x, y + h), CELL::Rgba4Byte(0,0,255,255),CELL::float2(x + w, y + h), CELL::Rgba4Byte(255,255,255,255),};static float inc = 1;CELL::matrix4 matRot;CELL::matrix4 matTran;CELL::matrix4 matTran1;matTran.translate(-150, -150, 0);matTran1.translate(150, 150, 0);inc += 1;matRot.rotateZ(inc);//注意矩阵相乘的顺序 首先对坐标系执行第一次平移(-150,-150),然后执行旋转,再对坐标系进行一次平移,平移坐标(150,150)//最后乘以投影矩阵CELL::matrix4 matModel = matTran1*(matRot*matTran);CELL::matrix4 matMVP = screenProj*matModel;glUniformMatrix4fv(_shader._MVP,1,false,matMVP.data());glVertexAttribPointer(_shader._position, 2, GL_FLOAT, false, sizeof(Vertex), vertex);glVertexAttribPointer(_shader._color,4,GL_UNSIGNED_BYTE,true,sizeof(Vertex),&vertex[0].color);glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);}_shader.end();}/*** 主函数*/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;}UpdateWindow(_hWnd);ShowWindow(_hWnd, SW_SHOW);if (!initOpenGLES20()){return false;}_shader.initialize();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{renderV2();eglSwapBuffers(_display, _surface);}}/*** 销毁OpenGLES20*/destroyOpenGLES20();return 0;}};}
程序入口
#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;}
完整代码下载地址:http://download.csdn.net/detail/hb707934728/9830841
0 0
- openglesForC++矩形旋转
- 矩形旋转
- 旋转矩形框
- android 矩形变换 图像旋转
- opencv 3.0 旋转矩形 RotatedRect
- 矩形旋转后的绘制
- RotatedRect类(旋转矩形)
- cocos旋转矩形碰撞检测
- 【Python】旋转打印各种矩形
- openglesForC++绘制草地
- 计算机图形学_矩形的旋转
- 计算矩形旋转角度(不精确)
- cci-Q1.6 矩形90度旋转
- OpenGL学习记录——旋转矩形
- OpenGL中简单动画之矩形旋转
- OpenCV 求外接矩形以及旋转角度
- 计算未旋转2矩形相交面积
- OpenGL制作会旋转的矩形
- UI框架(里面的东西非常全面)
- 题目1445:How Many Tables 九度OJ
- 【C++学习笔记】宽字符(LPCWTR/wstring)和(char*/string)的转换实现
- 杭电1029 之 Ignatius and the Princess IV
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-35: ordinal not in range(12
- openglesForC++矩形旋转
- 集合框架-Collections
- USACO 2017 January Contest, Gold Problem 1. Balanced Photo
- hololens
- Spring MVC常用的注解
- KM算法
- 单页应用跳转实现浅析-demo篇
- Appium 日常干货分享
- Vector,ArrayList,LinkedList,SynchronizedList