WIN32 实现OPenGL显示源码
来源:互联网 发布:和讯网社会责任数据 编辑:程序博客网 时间:2024/05/22 08:08
#include <windows.h>#include <GL\gl.h>#include <GL\glu.h>struct sample_MATERIAL{ GLfloat ambient[3]; GLfloat diffuse[3]; GLfloat specular[3]; GLfloat emission[3]; GLfloat alpha; GLfloat phExp; int texture;};static sample_MATERIAL materials [4] = { {{0.117647f,0.117647f,0.117647f},{0.752941f,0.752941f,0.752941f},{0.752941f,0.752941f,0.752941f},{0.0f,0.0f,0.0f},1.0f,8.0f,-1}, //Explorer Default {{1.0f,0.0f,0.0f},{1.0f,0.0f,0.0f},{0.628627f,0.628627f,0.628627f},{0.0f,0.0f,0.0f},1.0f,4.0f,-1}, //red {{0.0f,1.0f,0.0f},{0.0f,1.0f,0.0f},{0.628627f,0.628627f,0.628627f},{0.0f,0.0f,0.0f},1.0f,4.0f,-1}, //green {{0.0f,0.470588f,1.0f},{0.0f,0.470588f,1.0f},{0.628627f,0.628627f,0.628627f},{0.0f,0.0f,0.0f},1.0f,4.0f,-1} //blue};// 6 Verticies// 7 Texture Coordinates// 5 Normals// 8 Trianglesstatic BYTE face_indicies[8][9] = {// Pyramid01{0,4,1 ,0,0,0 ,0,1,2 }, {1,4,2 ,0,0,0 ,3,4,2 }, {2,4,3 ,0,0,0 ,2,4,0 },{3,4,0 ,0,0,0 ,0,4,5 }// Object-red, {5,2,3 ,1,1,1 ,6,0,2 }// Object02-g, {5,3,0 ,2,2,2 ,6,0,2 }// Object03-b, {5,1,2 ,3,3,3 ,6,0,2 }// Object04, {5,0,1 ,4,4,4 ,6,0,2 }};static GLfloat vertices [6][3] = {{-0.5f,-0.5f,-0.333333f},{0.5f,-0.5f,-0.333333f},{0.5f,0.5f,-0.333333f},{-0.5f,0.5f,-0.333333f},{-1.49378e-08f,1.02206e-08f,-0.333333f},{-1.49378e-08f,1.02206e-08f,0.333333f}};static GLfloat normals [5][3] = {{0.0f,0.0f,-1.0f},{0.0f,0.8f,0.6f},{-0.8f,0.0f,0.6f},{0.8f,0.0f,0.6f},{0.0f,-0.8f,0.6f}};static GLfloat textures [7][2] = {{0.0f,1.0f},{0.5f,0.5f},{1.0f,1.0f},{1.0f,2.0f},{0.5f,1.5f},{0.0f,2.0f},{0.5f,2.0f}};/*Material indicies*//*{material index,face count}*/static int material_ref [5][2] = {{0,4},{1,1},{2,1},{3,1},{0,1}};float sizex,sizey;LONG WINAPI WndProc (HWND, UINT, WPARAM, LPARAM);GLsizei glnWidth, glnHeight;GLdouble gldAspect;void SetDCPixelFormat (HWND,HDC);void InitializeRC (void);void DrawScene (HDC, UINT,UINT);HPALETTE hPalette = NULL;GLfloat nSize = 0.0f;GLfloat nCol = 0.0f;GLfloat nTop = 1.0f;GLfloat nBottom = 0.0f;int bFlag = 1;char wndname[256]="";int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){ static char szAppName[] = "3D Exploration Exported APP"; WNDCLASS wc; HWND hwnd; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; RegisterClass (&wc); hwnd = CreateWindow (szAppName, szAppName, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, HWND_DESKTOP, NULL, hInstance, NULL); ShowWindow (hwnd, nCmdShow); UpdateWindow (hwnd); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam;}/* * WndProc processes messages to the main window. */LONG WINAPI WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ static HDC hdc; static HGLRC hrc; PAINTSTRUCT ps; static UINT nAngle = 0; static UINT nAngle2 = 0; static UINT nTimer; int n; switch (msg) { case WM_CREATE: // // Create a rendering context and set a timer. // hdc = GetDC (hwnd); SetDCPixelFormat (hwnd,hdc); hrc = wglCreateContext (hdc); wglMakeCurrent (hdc, hrc); InitializeRC (); nTimer = SetTimer (hwnd, 1, 1, NULL); return 0; case WM_SIZE: // // Redefine the viewing volume and viewport when the window size // changes. // glnWidth = (GLsizei) LOWORD (lParam); glnHeight = (GLsizei) HIWORD (lParam); return 0; case WM_PAINT:{ // // Draw the scene. // BeginPaint (hwnd, &ps); DrawScene (hdc, nAngle,nAngle2); EndPaint (hwnd, &ps); }return 0; case WM_TIMER: // // Update the rotation angle and force a repaint. // nAngle += 2; if (nAngle >= 360) nAngle -= 360; nAngle2 += 1; if (nAngle2 >= 360) nAngle2 -= 360;if (bFlag == 1)nSize += 0.05f;nCol += 0.01f;if (nSize >= nTop)bFlag = 0;if (bFlag == 0)nSize -= 0.05f;nCol -= 0.01f;if (nSize <= nBottom)bFlag = 1;InvalidateRect (hwnd, NULL, FALSE); return 0; case WM_QUERYNEWPALETTE: // // If the program is using a color palette, realize the palette // and update the client area when the window receives the input // focus. // if (hPalette != NULL) { if (n = RealizePalette (hdc)) InvalidateRect (hwnd, NULL, FALSE); return n; } break; case WM_PALETTECHANGED: // // If the program is using a color palette, realize the palette // and update the colors in the client area when another program // realizes its palette. // if ((hPalette != NULL) && ((HWND) wParam != hwnd)) { if (RealizePalette (hdc)) UpdateColors (hdc); return 0; } break; case WM_DESTROY: // // Clean up and terminate. // wglMakeCurrent (NULL, NULL); wglDeleteContext (hrc); ReleaseDC (hwnd, hdc); if (hPalette != NULL) DeleteObject (hPalette); KillTimer (hwnd, nTimer); PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, msg, wParam, lParam);}/* * SetDCPixelFormat sets the pixel format for a device context in * preparation for creating a rendering context. * * Input parameters: * hdc = Device context handle * * Returns: * Nothing */void SetDCPixelFormat (HWND hwnd,HDC hdc){ HANDLE hHeap; int nColors, i; LPLOGPALETTE lpPalette; BYTE byRedMask, byGreenMask, byBlueMask; static PIXELFORMATDESCRIPTOR pfd = { sizeof (PIXELFORMATDESCRIPTOR), // Size of this structure 1, // Version number PFD_DRAW_TO_WINDOW | // Flags PFD_SUPPORT_OPENGL | PFD_GENERIC_ACCELERATED| PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, // RGBA pixel values 24, // 24-bit color 0, 0, 0, 0, 0, 0, // Don't care about these 0, 0, // No alpha buffer 0, 0, 0, 0, 0, // No accumulation buffer 32, // 32-bit depth buffer 0, // No stencil buffer 0, // No auxiliary buffers PFD_MAIN_PLANE, // Layer type 0, // Reserved (must be 0) 0, 0, 0 // No layer masks }; int nPixelFormat; nPixelFormat = ChoosePixelFormat (hdc, &pfd); SetPixelFormat (hdc, nPixelFormat, &pfd); if (pfd.dwFlags & PFD_NEED_PALETTE) { nColors = 1 << pfd.cColorBits; hHeap = GetProcessHeap (); (LPLOGPALETTE) lpPalette = (LPLOGPALETTE)HeapAlloc (hHeap, 0, sizeof (LOGPALETTE) + (nColors * sizeof (PALETTEENTRY))); lpPalette->palVersion = 0x300; lpPalette->palNumEntries = nColors; byRedMask = (1 << pfd.cRedBits) - 1; byGreenMask = (1 << pfd.cGreenBits) - 1; byBlueMask = (1 << pfd.cBlueBits) - 1; for (i=0; i<nColors; i++) { lpPalette->palPalEntry[i].peRed = (((i >> pfd.cRedShift) & byRedMask) * 255) / byRedMask; lpPalette->palPalEntry[i].peGreen = (((i >> pfd.cGreenShift) & byGreenMask) * 255) / byGreenMask; lpPalette->palPalEntry[i].peBlue = (((i >> pfd.cBlueShift) & byBlueMask) * 255) / byBlueMask; lpPalette->palPalEntry[i].peFlags = 0; } hPalette = CreatePalette (lpPalette); HeapFree (hHeap, 0, lpPalette); if (hPalette != NULL) { SelectPalette (hdc, hPalette, FALSE); RealizePalette (hdc); } }}/* * InitializeRC initializes the current rendering context. * * Input parameters: * None * * Returns: * Nothing */void InitializeRC (void){ GLfloat glfLightAmbient[] = { 0.1f, 0.1f, 0.1f, 1.0f }; GLfloat glfLightDiffuse[] = { 1.2f, 1.2f, 1.2f, 1.0f }; GLfloat glfLightSpecular[] = { 0.9f, 0.9f, 0.9f, 1.0f }; // // Add a light to the scene. // glLightfv (GL_LIGHT0, GL_AMBIENT, glfLightAmbient); glLightfv (GL_LIGHT0, GL_DIFFUSE, glfLightDiffuse); glLightfv (GL_LIGHT0, GL_SPECULAR, glfLightSpecular); glEnable (GL_LIGHTING); glEnable (GL_LIGHT0); // // Enable depth testing and backface culling. // glEnable (GL_DEPTH_TEST); glEnable (GL_CULL_FACE);}void MyMaterial(GLenum mode,GLfloat *f,GLfloat alpha){ GLfloat d[4]; d[0]=f[0]; d[1]=f[1]; d[2]=f[2]; d[3]=alpha; glMaterialfv (GL_FRONT_AND_BACK,mode,d);}/* * SelectMaterial uses OpenGL commands to define facet colors. * * Returns: * Nothing */void SelectMaterial(int i){ // // Define the reflective properties of the 3D Object faces. // glEnd(); GLfloat alpha=materials[i].alpha; MyMaterial (GL_AMBIENT, materials[i].ambient,alpha); MyMaterial (GL_DIFFUSE, materials[i].diffuse,alpha); MyMaterial (GL_SPECULAR, materials[i].specular,alpha); MyMaterial (GL_EMISSION, materials[i].emission,alpha); glMaterialf (GL_FRONT_AND_BACK,GL_SHININESS,materials[i].phExp); glBegin(GL_TRIANGLES);}/* * DrawScene uses OpenGL commands to draw a object. * * Input parameters: * hdc = Device context handle * nAngle = Angle of rotation for object * * Returns: * Nothing */void DrawScene (HDC hdc, UINT nAngle,UINT nAngle2){ sizex=glnWidth; sizey=glnHeight; gldAspect = (GLdouble) glnWidth / (GLdouble) glnHeight; glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (30.0, // Field-of-view angle gldAspect, // Aspect ratio of viewing volume 1.0, // Distance to near clipping plane 10.0); // Distance to far clipping plane glViewport (0, 0, glnWidth, glnHeight); // // Clear the color and depth buffers. // glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // // Define the modelview transformation. // glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glTranslatef (0.0f, 0.0f, -8.0f); glRotatef (30.0f, 1.0f, 0.0f, 0.0f); glRotatef ((GLfloat) nAngle, 0.0f, 1.0f, 0.0f); glRotatef ((GLfloat) nAngle2, 1.0f, 0.0f, 0.0f); glScalef (nSize+2.5f,nSize+2.5f,nSize+2.5f); int mcount=0;int mindex=0;glBegin (GL_TRIANGLES); for(int i=0;i<sizeof(face_indicies)/sizeof(face_indicies[0]);i++){ if(!mcount) { SelectMaterial(material_ref[mindex][0]); mcount=material_ref[mindex][1]; mindex++; } mcount--;for(int j=0;j<3;j++) { int vi=face_indicies[i][j]; int ni=face_indicies[i][j+3]; int ti=face_indicies[i][j+6]; glNormal3f (normals[ni][0],normals[ni][1],normals[ni][2]); glTexCoord2f(textures[ti][0],textures[ti][1]); glVertex3f (vertices[vi][0],vertices[vi][1],vertices[vi][2]); } } glEnd (); // // Swap the buffers. // glFlush(); SwapBuffers (hdc);};
注意添加:
#pragma comment( lib, "glaux.lib")
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
#pragma comment( lib, "glaux.lib" )
- WIN32 实现OPenGL显示源码
- Win32 OpenGL编程(14) 显示列表
- Win32 OpenGL编程(15) 位图显示
- OpenGL: OpenGL实现立体显示
- OpenGL实现立体显示
- OpenGL: 实现立体显示
- OpenGL立体显示实现
- Win32下使用OpenGL实现渲染
- 气泡显示的win32汇编源码
- 第二人生的源码分析(八十五)LLView实现OpenGL窗口显示
- Cocos 在win32 平台上显示中文(仅实现win32)
- Win32 守护进程实现-- ACL 源码分析
- win32实现类酷狗安装的进度条显示
- OpenGL: OpenGL下实现图片满屏显示
- 用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口
- Win32 OpenGL系列专题
- Opengl and Win32
- win32+opengl编程框架
- poj1611 The Suspects (并查集)
- SQL语句中把多条记录同一字段的值连接成一个字符串显示结果集(sql stuff)
- 转载几个牛人的牛语录:有关FPGA和DSP和ARM的。
- android中使用adb shell命令kill掉应用程序
- 程式語言的特性本質(四)往數學領域抽象化的函數程式設計
- WIN32 实现OPenGL显示源码
- Oracle WIP Backflush
- oracle主键和外键
- linux常用svn命令
- poj1182 食物链 (并查集)
- 手动安装 jirafe (Manual Installation Method)
- <win8>(一)实例讲解win8(XAML+C#)开发--------课程表:序言
- 关于java的equals和hashcode方法
- 如何突破24M内存的限制,为Android程序分配到更多内存