TestOpenGL
来源:互联网 发布:java产生随机数的代码 编辑:程序博客网 时间:2024/05/15 23:55
#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);void EnableOpenGL(HWND hwnd, HDC*, HGLRC*);void DisableOpenGL(HWND, HDC, HGLRC);static float g_val_ud = 0.0f;static float g_val_ud_rate = 0.1f;static float g_val_lr = 0.0f;static float g_val_lr_rate = 5.0f;static float g_val_ws = 0.0f;static float g_val_ws_rate = 0.1f;static float g_val_ad = 0.0f;static float g_val_ad_rate = 0.1f;static void DrawSomething(){ glTranslatef(0.0f, 0.0f, -2.0f); // 往屏幕内移动2个单位(即:Z轴负方向) glRotatef(g_val_lr, 0.0f, 1.0f, 0.0f); // 绕中心线旋转(旋转方向符合右手定则) // 中心线 glBegin(GL_LINES); glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(1.0f, 0.5f, 1.0f);glVertex3f(0.0f, -1.0f, 0.0f); glEnd(); float line_half_len = 0.2f; // 黄色正方形 glPushMatrix(); glTranslatef(0.0f, 0.0f, line_half_len); glBegin(GL_LINES); glColor3f(1.0f, 1.0f, 0.0f);glVertex2f(0-line_half_len, line_half_len);glVertex2f(line_half_len, line_half_len); glColor3f(1.0f, 1.0f, 0.0f);glVertex2f(0-line_half_len, 0-line_half_len);glVertex2f(line_half_len, 0-line_half_len); glColor3f(1.0f, 1.0f, 0.0f);glVertex2f(0-line_half_len, line_half_len);glVertex2f(0-line_half_len, 0-line_half_len); glColor3f(1.0f, 1.0f, 0.0f);glVertex2f(line_half_len, line_half_len);glVertex2f(line_half_len, 0-line_half_len); glEnd(); glPopMatrix(); // 红色正方形 glPushMatrix(); glTranslatef(0.0f, 0.0f, 0-line_half_len); glBegin(GL_LINES); glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(0-line_half_len, line_half_len);glVertex2f(line_half_len, line_half_len); glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(0-line_half_len, 0-line_half_len);glVertex2f(line_half_len, 0-line_half_len); glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(0-line_half_len, line_half_len);glVertex2f(0-line_half_len, 0-line_half_len); glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(line_half_len, line_half_len);glVertex2f(line_half_len, 0-line_half_len); glEnd(); glPopMatrix(); glBegin(GL_LINES); glColor3f(0.0f, 1.0f, 0.0f);glVertex3f(0-line_half_len, line_half_len, 0-line_half_len); glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(0-line_half_len, line_half_len, line_half_len); glColor3f(0.0f, 1.0f, 0.0f);glVertex3f(line_half_len, line_half_len, 0-line_half_len); glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(line_half_len, line_half_len, line_half_len); glColor3f(0.0f, 1.0f, 0.0f);glVertex3f(0-line_half_len, 0-line_half_len, 0-line_half_len); glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(0-line_half_len, 0-line_half_len, line_half_len); glColor3f(0.0f, 1.0f, 0.0f);glVertex3f(line_half_len, 0-line_half_len, 0-line_half_len); glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(line_half_len, 0-line_half_len, line_half_len); glEnd(); GLUquadric* quad = gluNewQuadric(); glPushMatrix(); glTranslatef(0.2f, 0.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); //蓝色 gluSphere(quad,0.1,8,8); glPopMatrix(); glPushMatrix(); glTranslatef(-0.2f, 0.0f, 0.0f); glColor3f(1.0f, 0.5f, 0.5f); //粉色 gluSphere(quad,0.15,30,30); glPopMatrix(); gluDeleteQuadric(quad);}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ WNDCLASSEX wcex; HWND hwnd; HDC hDC; HGLRC hRC; MSG msg; BOOL bQuit = FALSE; /* register window class */ wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_OWNDC; wcex.lpfnWndProc = WindowProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wcex.lpszMenuName = NULL; wcex.lpszClassName = "GLSample"; wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);; if (!RegisterClassEx(&wcex)) return 0; /* create main window */ hwnd = CreateWindowEx(0, "GLSample", "OpenGL Sample", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 512, 512, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); /* enable OpenGL for the window */ EnableOpenGL(hwnd, &hDC, &hRC); /* program main loop */ while (!bQuit) { /* check for messages */ if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { /* OpenGL animation code goes here */ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glOrtho(-2.0,2.0f,-2.0f,2.0f,-10.0f,10.0f); glFrustum(-2.0f,2.0f,-2.0f,2.0f,1.0f,10.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt( g_val_ad, g_val_ud, -g_val_ws, g_val_ad, g_val_ud, -g_val_ws-0.1f, 0.0f, 1.0f, 0.0f); //glTranslatef(-g_val_ad,-g_val_ud,g_val_ws); DrawSomething(); SwapBuffers(hDC); } } /* shutdown OpenGL */ DisableOpenGL(hwnd, hDC, hRC); /* destroy the window explicitly */ DestroyWindow(hwnd); return msg.wParam;}LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch (uMsg) { case WM_CLOSE: PostQuitMessage(0); break; case WM_DESTROY: return 0; case WM_KEYDOWN: { switch (wParam) { case VK_ESCAPE: PostQuitMessage(0); break; case VK_SPACE: g_val_ud = 0.0f; g_val_lr = 0.0f; g_val_ws = 0.0f; g_val_ad = 0.0f; break; case VK_UP: g_val_ud += g_val_ud_rate; break; case VK_DOWN: g_val_ud -= g_val_ud_rate; break; case VK_LEFT: g_val_lr -= g_val_lr_rate; break; case VK_RIGHT: g_val_lr += g_val_lr_rate; break; case 'W': g_val_ws += g_val_ws_rate; break; case 'S': g_val_ws -= g_val_ws_rate; break; case 'A': g_val_ad -= g_val_ad_rate; break; case 'D': g_val_ad += g_val_ad_rate; break; default: break; } } break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0;}void EnableOpenGL(HWND hwnd, HDC* hDC, HGLRC* hRC){ PIXELFORMATDESCRIPTOR pfd; int iFormat; /* get the device context (DC) */ *hDC = GetDC(hwnd); /* set the pixel format for the DC */ ZeroMemory(&pfd, sizeof(pfd)); pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat(*hDC, &pfd); SetPixelFormat(*hDC, iFormat, &pfd); /* create and enable the render context (RC) */ *hRC = wglCreateContext(*hDC); wglMakeCurrent(*hDC, *hRC); glEnable(GL_DEPTH_TEST);}void DisableOpenGL (HWND hwnd, HDC hDC, HGLRC hRC){ wglMakeCurrent(NULL, NULL); wglDeleteContext(hRC); ReleaseDC(hwnd, hDC);}
0 0
- TestOpenGL
- 机器人开发仿真软件
- 使用二维码——第三方库ZBar和libqrencode的使用
- 安卓实习期间整理知识点(七)
- CSS中强大的EM
- Redis源码解析(六):redis之闲话java客户端
- TestOpenGL
- MR Multiple
- Java实现中文算数验证码(算数运算+-*/)
- Data Structures and Algorithm Analysis in C 学习之List
- LeetCode_Swap Nodes in Pairs
- Android判断对象是否为空工具类
- hdu 1757 A Simple Math Problem(矩阵快速幂)
- 解决phpExcel导出乱码且Content-Type失效的问题
- 最大子序列和的问题的解