一个比较简单的红蓝图opengl程序

#include "stdafx.h"
#include<gl/glew.h>
#include <stdlib.h>
#include<iostream>
#include <GL/glut.h>
#include<gl/gl.h>
#include <windows.h>

static float angle=0;

void init(void) 
{
	// all parameters of lighting attrubutes
	float  light_specular[]={0.8, 0.0, 0.8, 1.0};
	float  light_ambient[]={0.2, 0.0, 0.2, 1.0};
	float  light_diffuse[]={0.8, 0.0, 0.8, 1.0};
	float  light_position[]={0.0, 0.0, 3.0,0.0};
	float  spot_direction[]={0.0, 0.0, 0.0,0.0};

	 glLight0 gets the parameters
	glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
/*
	// attenuation parameters are set
	glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.5);
    glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.5);
    glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.2);
	// spot cutoff and direction and eponent
    glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0);
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
    glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 2.0);
*/
	// all parameters of material attributes
    float  mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    float  mat_shininess[] = { 50.0 };
    float  mat_ambient[]={1.0, 1.0, 1.0, 1.0};
    float  mat_diffuse[]={1.0, 1.0, 1.0, 1.0};

	// material is set 
	glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR,mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

	// ligthtmodel information 
	GLfloat lightmodel_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lightmodel_ambient);

	// fundanmental information 
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel (GL_SMOOTH);
	
	// enable lighting 
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

	glEnable(GL_DEPTH_TEST);
}

void display(void)
{
   glColorMask(1.0,1.0,1.0,1.0);
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

   //left teapot
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glColorMask(1.0,0.0,0.0,0.0);
   glPushMatrix();

   glRotatef(angle, 0, 0, 1);
   glTranslatef(-0.2, 0.0, -10.0);
   glutSolidTeapot(2.0);
   glPopMatrix();

   //right teapot
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glPushMatrix();
   glColorMask(0.0,0.0,1.0,0.0);

   glRotatef(angle, 0, 0, 1);
   glTranslatef(0.2,0.0,0.0);
   glutSolidTeapot(2.0);
   glPopMatrix();
   glFlush();
   
}

void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho (-5, +5, -5, +5, -15.0, 10.0);
}

void idle()
{
	angle=angle+1;
	if(angle>360)
		angle=angle-360;
	glutPostRedisplay();
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
   glutInitWindowSize(500, 500);
   glutInitWindowPosition(100, 100);
   glutCreateWindow(argv[0]);
   init();
   glutReshapeFunc(reshape);
   glutDisplayFunc(display);
   glutIdleFunc(idle);
   glutMainLoop();
   return 0;
}



还有一个是:

  1. #pragma comment( lib, "opengl32.lib" )  
  2. #pragma comment( lib, "glu32.lib" )  
  3. #pragma comment( lib, "GLut32.lib" )  
  4. #pragma comment( lib, "GLaux.lib" )  
  5. #include <windows.h>  // Windows的头文件  
  6. #include <stdio.h>        // 标准输入/输出库的头文件 (新增)  
  7. #include <gl\gl.h>        // OpenGL32库的头文件  
  8. #include <gl\glu.h>       // GLu32库的头文件  
  9. #include <gl\glaux.h> // GLaux库的头文件  
  10.   
  11. HGLRC       hRC=NULL;           // 永久着色描述表  
  12. HDC         hDC=NULL;           // 私有GDI设备描述表  
  13. HWND        hWnd=NULL;          // 保存我们的窗口句柄  
  14. HINSTANCE   hInstance;          // 保存程序的实例  
  15.   
  16. bool    keys[256];              // 用于键盘例程的数组  
  17. bool    active=TRUE;            // 窗口的活动标志,缺省为TRUE  
  18. bool    fullscreen=TRUE;        // 全屏标志缺省设定成全屏模式  
  19. int     FSpeed=3;               // 红篮交换帧频的速度,越大越慢  
  20. int     FrameSpeed=FSpeed;        
  21. float   RSpeed=4.0f;            // 旋转速度,越大越快  
  22. float   Rot=0.0f;  
  23.   
  24. LRESULT CALLBACK WndProc(HWNDUINTWPARAMLPARAM);   // WndProc的定义  
  25.   
  26. GLvoid ReSizeGLScene(GLsizei width, GLsizei height)     // 重置并初始化GL窗口大小  
  27. {  
  28.     if (height==0)                                      // 防止被零除  
  29.     {  
  30.         height=1;                                       // 将Height设为1  
  31.     }  
  32.   
  33.     glViewport(0,0,width,height);                       // 重置当前的视口(Viewport)  
  34.   
  35.     glMatrixMode(GL_PROJECTION);                        // 选择投影矩阵  
  36.     glLoadIdentity();                                   // 重置投影矩阵  
  37.   
  38.     // 计算窗口的外观比例  
  39.     gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);  
  40.   
  41.     glMatrixMode(GL_MODELVIEW);                         // 选择模型观察矩阵  
  42.     glLoadIdentity();                                   // 重置模型观察矩阵  
  43. }  
  44.   
  45. int InitGL(GLvoid)                                      // 此处开始对OpenGL进行所有设置  
  46. {  
  47.     glShadeModel(GL_SMOOTH);                            // 启用阴影平滑  
  48.     glClearColor(0.0f, 0.0f, 0.0f, 0.5f);               // 黑色背景  
  49.     glClearDepth(1.0f);                                 // 设置深度缓存  
  50.     glEnable(GL_DEPTH_TEST);                            // 启用深度测试  
  51.     glDepthFunc(GL_LEQUAL);                             // 所作深度测试的类型  
  52.     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // 真正精细的透视修正  
  53.     return TRUE;                                        // 初始化 OK  
  54. }  
  55.   
  56. //画导弹模型  
  57. void drawMissile(void)  
  58. {  
  59.   
  60.     float scale=0.06;  
  61.     float P[3]={0*scale,0*scale,13*scale};  //导弹顶点  
  62. //  float Pr[3]={9,0,0};//导弹尾点  
  63.   
  64.     float A[3]={ 1*scale, 1.732*scale, 7*scale};    //前六边形  
  65.     float B[3]={ 2*scale, 0*scale    , 7*scale};  
  66.     float C[3]={ 1*scale,-1.732*scale, 7*scale};  
  67.     float D[3]={-1*scale,-1.732*scale, 7*scale};  
  68.     float E[3]={-2*scale, 0*scale    , 7*scale};  
  69.     float F[3]={-1*scale, 1.732*scale, 7*scale};  
  70.   
  71.     float Ar[3]={ 1*scale, 1.732*scale, -7*scale};  //后六边形  
  72.     float Br[3]={ 2*scale, 0*scale    , -7*scale};  
  73.     float Cr[3]={ 1*scale,-1.732*scale, -7*scale};  
  74.     float Dr[3]={-1*scale,-1.732*scale, -7*scale};  
  75.     float Er[3]={-2*scale, 0*scale    , -7*scale};  
  76.     float Fr[3]={-1*scale, 1.732*scale, -7*scale};  
  77.   
  78.   
  79.     //四个尾翼,每个尾翼4个点  
  80.     float WY[4][4][3]={  
  81.         {{2*scale  ,0*scale  ,3*scale},{3.5*scale  ,0*scale    ,-5.5*scale},{4*scale  ,0*scale    ,-9*scale},{2*scale   ,0*scale  ,-8*scale}},  
  82.         {{0*scale  ,1.732*scale  ,3*scale},{0*scale    ,3.5*scale  ,-5.5*scale},{0*scale    ,4*scale  ,-9*scale},{0*scale   ,1.732*scale  ,-8*scale}},  
  83.         {{-2*scale ,0*scale  ,3*scale},{-3.5*scale ,0*scale    ,-5.5*scale},{-4*scale ,0*scale    ,-9*scale},{-2*scale  ,0*scale  ,-8*scale}},  
  84.         {{0*scale  ,-1.732*scale ,3*scale},{0*scale    ,-3.5*scale ,-5.5*scale},{0*scale    ,-4*scale ,-9*scale},{0*scale   ,-1.732*scale ,-8*scale}}  
  85.     };  //1  
  86.   
  87.   
  88.         //glColor3f(1,0,0);  
  89.         glBegin(GL_TRIANGLES);  //画顶盖=========================  
  90.             //glShadeModel(GL_SMOOTH);  
  91.             glVertex3fv(P);  
  92.             glVertex3fv(A);  
  93.             glVertex3fv(F);  
  94.         glEnd();  
  95.         glBegin(GL_TRIANGLES);  
  96.             glVertex3fv(P);  
  97.             glVertex3fv(F);  
  98.             glVertex3fv(E);  
  99.         glEnd();  
  100.         glBegin(GL_TRIANGLES);  
  101.             glVertex3fv(P);  
  102.             glVertex3fv(E);  
  103.             glVertex3fv(D);  
  104.         glEnd();  
  105.         glBegin(GL_TRIANGLES);  
  106.             glVertex3fv(P);  
  107.             glVertex3fv(D);  
  108.             glVertex3fv(C);  
  109.         glEnd();  
  110.         glBegin(GL_TRIANGLES);  
  111.             glVertex3fv(P);  
  112.             glVertex3fv(C);  
  113.             glVertex3fv(B);  
  114.         glEnd();  
  115.         glBegin(GL_TRIANGLES);  
  116.             glVertex3fv(P);  
  117.             glVertex3fv(B);  
  118.             glVertex3fv(A);  
  119.         glEnd();  
  120.   
  121.         //画弹身===================================  
  122.         //glColor3f(0.5,0.5,0.5);  
  123.         glBegin(GL_QUADS);  
  124.             glVertex3fv(A);  
  125.             glVertex3fv(Ar);  
  126.             glVertex3fv(Fr);  
  127.             glVertex3fv(F);  
  128.         glEnd();  
  129.         glBegin(GL_QUADS);  
  130.             glVertex3fv(F);  
  131.             glVertex3fv(Fr);  
  132.             glVertex3fv(Er);  
  133.             glVertex3fv(E);  
  134.         glEnd();  
  135.         glBegin(GL_QUADS);  
  136.             glVertex3fv(E);  
  137.             glVertex3fv(Er);  
  138.             glVertex3fv(Dr);  
  139.             glVertex3fv(D);  
  140.         glEnd();  
  141.         glBegin(GL_QUADS);  
  142.             glVertex3fv(D);  
  143.             glVertex3fv(Dr);  
  144.             glVertex3fv(Cr);  
  145.             glVertex3fv(C);  
  146.         glEnd();  
  147.         glBegin(GL_QUADS);  
  148.             glVertex3fv(C);  
  149.             glVertex3fv(Cr);  
  150.             glVertex3fv(Br);  
  151.             glVertex3fv(B);  
  152.         glEnd();  
  153.         glBegin(GL_QUADS);  
  154.             glVertex3fv(B);  
  155.             glVertex3fv(Br);  
  156.             glVertex3fv(Ar);  
  157.             glVertex3fv(A);  
  158.         glEnd();  
  159.   
  160.         //画底盖  
  161.         glBegin(GL_POLYGON);  
  162.             glVertex3fv(Ar);  
  163.             glVertex3fv(Br);  
  164.             glVertex3fv(Cr);  
  165.             glVertex3fv(Dr);  
  166.             glVertex3fv(Er);  
  167.             glVertex3fv(Fr);  
  168.         glEnd();  
  169.   
  170.         //画尾翼========================================  
  171.         //glColor3f(0.1,0.5,1.0);  
  172.         for(int i=0;i<=3;i++)  
  173.         {  
  174.         glBegin(GL_QUADS);  
  175.             glVertex3f(WY[i][0][0],WY[i][0][1],WY[i][0][2]);  
  176.             glVertex3f(WY[i][1][0],WY[i][1][1],WY[i][1][2]);  
  177.             glVertex3f(WY[i][2][0],WY[i][2][1],WY[i][2][2]);  
  178.             glVertex3f(WY[i][3][0],WY[i][3][1],WY[i][3][2]);  
  179.         glEnd();  
  180.         }  
  181. }  
  182.   
  183.   
  184. //********************************************************  
  185. int DrawGLScene(GLvoid)                                 //从这里开始进行所有的绘制  
  186. {  
  187.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存  
  188.     glLoadIdentity();                                   // 重置当前的模型观察矩阵  
  189.     float pos[3];   //物体的位置  
  190.     float color[3]; //物体的颜色  
  191.     pos[1]=-0.1f;  
  192.     pos[2]=-3.0f;  
  193.     if(FrameSpeed<=(FSpeed/2))  
  194.     {  
  195.         pos[0]=-0.02f;  
  196.         color[0]=1.0f;  
  197.         color[1]=0.0f;  
  198.         color[2]=0.0f;  
  199.     }  
  200.     else  
  201.     {  
  202.         pos[0]=0.02f;  
  203.         color[0]=0.0f;  
  204.         color[1]=0.0f;  
  205.         color[2]=1.0f;  
  206.     }  
  207.         glPushMatrix();  
  208.         glTranslatef(pos[0],pos[1],pos[2]);  
  209.         glColor3f(color[0],color[1],color[2]);  
  210.         glRotatef(Rot,1,1,1);//degree X、Y、Z  
  211. /*  
  212.         glBegin(GL_TRIANGLES);  
  213.             glVertex3f( 0.0f, 1.0f, 0.0f);  
  214.             glVertex3f(-0.5f, 0.0f, 0.0f);  
  215.             glVertex3f( 0.5f, 0.0f, 0.0f);  
  216.         glEnd();  
  217. */        
  218.         drawMissile();  
  219.         glPopMatrix();  
  220.   
  221.     FrameSpeed--;//帧减一  
  222.     if(FrameSpeed<0)FrameSpeed=FSpeed;  
  223.   
  224.     Rot+=RSpeed;  
  225.     if(Rot>=360.0f)Rot=0.0f;  
  226.     return TRUE;                                        // 一切 OK  
  227. }  
  228.   
  229. //此代码只在程序退出之前调用  
  230. GLvoid KillGLWindow(GLvoid)                             // 正常销毁窗口  
  231. {  
  232.     if (fullscreen)                                     // 我们处于全屏模式吗?  
  233.     {  
  234.         ChangeDisplaySettings(NULL,0);                  // 是的话,切换回桌面  
  235.         ShowCursor(TRUE);                               // 显示鼠标指针  
  236.     }  
  237.   
  238.     if (hRC)                                            // 我们拥有着色描述表吗?  
  239.     {  
  240.         if (!wglMakeCurrent(NULL,NULL))                 // 我们能否释放DC和RC描述表?  
  241.         {  
  242.             MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);  
  243.         }  
  244.   
  245.         if (!wglDeleteContext(hRC))                     // 我们能否删除RC?  
  246.         {  
  247.             MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);  
  248.         }  
  249.         hRC=NULL;                                       // 将RC设为 NULL  
  250.     }  
  251.   
  252.     if (hDC && !ReleaseDC(hWnd,hDC))                    // 我们能否释放 DC?  
  253.     {  
  254.         MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);  
  255.         hDC=NULL;                                       // 将 hDC 设为 NULL  
  256.     }  
  257.   
  258.     if (hWnd && !DestroyWindow(hWnd))                   // 能否销毁窗口?  
  259.     {  
  260.         MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);  
  261.         hWnd=NULL;                                      // 将 hWnd 设为 NULL  
  262.     }  
  263.   
  264.     if (!UnregisterClass("OpenGL",hInstance))           // 能否注销类?  
  265.     {  
  266.         MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);  
  267.         hInstance=NULL;                                 // 将 hInstance 设为 NULL  
  268.     }  
  269. }  
  270.   
  271.   
  272.   
  273. /*  This Code Creates Our OpenGL Window.  Parameters Are:                   * 
  274.  *  title           - Title To Appear At The Top Of The Window              * 
  275.  *  width           - Width Of The GL Window Or Fullscreen Mode             * 
  276.  *  height          - Height Of The GL Window Or Fullscreen Mode            * 
  277.  *  bits            - Number Of Bits To Use For Color (8/16/24/32)          * 
  278.  *  fullscreenflag  - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE)    
  279. 此过程返回布尔变量(TRUE或FALSE)。 
  280. 他还带有5个参数: 
  281. 窗口的标题栏,窗口的宽度,窗口的高度,色彩位数(16/24/32), 
  282. 和全屏标志(TRUE — 全屏模式,FALSE — 窗口模式)。返回的布尔值告诉我们窗口是否成功创建。 
  283. */  
  284. BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)  
  285. {  
  286.     GLuint      PixelFormat;            // 保存查找匹配的结果  
  287.     WNDCLASS    wc;                     // 窗口类结构  
  288.     DWORD       dwExStyle;              // 扩展窗口风格  
  289.     DWORD       dwStyle;                // 窗口风格  
  290.     RECT        WindowRect;             // 取得矩形的左上角和右下角的坐标值  
  291.     WindowRect.left=(long)0;            // 将Left 设为 0  
  292.     WindowRect.right=(long)width;       // 将Right 设为要求的宽度  
  293.     WindowRect.top=(long)0;             // 将Top 设为 0  
  294.     WindowRect.bottom=(long)height;     // 将Bottom 设为要求的高度  
  295.   
  296.     fullscreen=fullscreenflag;          // 设置全局全屏标志  
  297.   
  298.     hInstance           = GetModuleHandle(NULL);                // 取得我们窗口的实例  
  299.     wc.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;   // 移动时重画,并为窗口取得DC  
  300.     wc.lpfnWndProc      = (WNDPROC) WndProc;                    // WndProc处理消息  
  301.     wc.cbClsExtra       = 0;                                    // 无额外窗口数据  
  302.     wc.cbWndExtra       = 0;                                    // 无额外窗口数据  
  303.     wc.hInstance        = hInstance;                            // 设置实例  
  304.     wc.hIcon            = LoadIcon(NULL, IDI_WINLOGO);          // 装入缺省图标  
  305.     wc.hCursor          = LoadCursor(NULL, IDC_ARROW);          // 装入鼠标指针  
  306.     wc.hbrBackground    = NULL;                                 // GL不需要背景  
  307.     wc.lpszMenuName     = NULL;                                 // 不需要菜单  
  308.     wc.lpszClassName    = "OpenGL";                             // 设定类名字  
  309.   
  310.     if (!RegisterClass(&wc))                                    // 尝试注册窗口类  
  311.     {  
  312.         MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);  
  313.         return FALSE;                                           // 退出并返回FALSE  
  314.     }  
  315.       
  316.     if (fullscreen)                                             // 要尝试全屏模式吗?  
  317.     {  
  318.         DEVMODE dmScreenSettings;                               // 设备模式  
  319.         memset(&dmScreenSettings,0,sizeof(dmScreenSettings));   // 确保内存分配  
  320.         dmScreenSettings.dmSize=sizeof(dmScreenSettings);       // Devmode 结构的大小  
  321.         dmScreenSettings.dmPelsWidth    = width;                // 所选屏幕宽度  
  322.         dmScreenSettings.dmPelsHeight   = height;               // 所选屏幕高度  
  323.         dmScreenSettings.dmBitsPerPel   = bits;                 // 每象素所选的色彩深度  
  324.         dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;  
  325.   
  326.         // 尝试设置显示模式并返回结果。注: CDS_FULLSCREEN 移去了状态条。  
  327.         if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)  
  328.         {  
  329.             // 若模式失败,提供两个选项:退出或在窗口内运行。  
  330.             if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","kingwise GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)  
  331.             {  
  332.                 fullscreen=FALSE;       // 选择窗口模式(Fullscreen=FALSE)  
  333.             }  
  334.             else  
  335.             {  
  336.                 // Pop Up A Message Box Letting User Know The Program Is Closing.  
  337.                 MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);  
  338.                 return FALSE;                                   // Return FALSE  
  339.             }  
  340.         }  
  341.     }  
  342.   
  343.     if (fullscreen)                                             // 仍处于全屏模式吗?  
  344.     {  
  345.         dwExStyle=WS_EX_APPWINDOW;                              // 扩展窗体风格  
  346.         dwStyle=WS_POPUP;                                       // 窗体风格  
  347.         ShowCursor(FALSE);                                      // 隐藏鼠标指针  
  348.     }  
  349.     else  
  350.     {  
  351.         dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;           // 扩展窗体风格  
  352.         dwStyle=WS_OVERLAPPEDWINDOW;                            // 窗体风格  
  353.     }  
  354.   
  355.     AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);     // 调整窗口达到真正要求的大小  
  356.     // Create The Window  
  357.     if (!(hWnd=CreateWindowEx(  dwExStyle,                          // 扩展窗体风格  
  358.                                 "OpenGL",                           // 类名字  
  359.                                 title,                              // 窗口标题  
  360.                                 dwStyle |                           // Defined Window Style  
  361.                                 WS_CLIPSIBLINGS |                   // 必须的窗体风格属性  
  362.                                 WS_CLIPCHILDREN,                    // 必须的窗体风格属性  
  363.                                 0, 0,                               // 窗口位置  
  364.                                 WindowRect.right-WindowRect.left,   // 计算调整好的窗口宽度  
  365.                                 WindowRect.bottom-WindowRect.top,   // 计算调整好的窗口高度  
  366.                                 NULL,                               // 无父窗口  
  367.                                 NULL,                               // 无菜单  
  368.                                 hInstance,                          // 实例  
  369.                                 NULL)))                             // 不向WM_CREATE传递任何东东  
  370.     {  
  371.         KillGLWindow();                             // 重置显示区  
  372.         MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);  
  373.         return FALSE;                               // Return FALSE  
  374.     }  
  375.   
  376.     static  PIXELFORMATDESCRIPTOR pfd=              // pfd 告诉窗口我们所希望的东东  
  377.     {  
  378.         sizeof(PIXELFORMATDESCRIPTOR),              // 上诉格式描述符的大小  
  379.         1,                                          // 版本号  
  380.         PFD_DRAW_TO_WINDOW |                        // 格式必须支持窗口  
  381.         PFD_SUPPORT_OPENGL |                        // 格式必须支持OpenGL  
  382.         PFD_DOUBLEBUFFER,                           // 必须支持双缓冲  
  383.         PFD_TYPE_RGBA,                              // 申请 RGBA 格式  
  384.         bits,                                       // 选定色彩深度  
  385.         0, 0, 0, 0, 0, 0,                           // 忽略的色彩位  
  386.         0,                                          // 无Alpha缓存  
  387.         0,                                          // 忽略Shift Bit  
  388.         0,                                          // 无聚集缓存  
  389.         0, 0, 0, 0,                                 // 忽略聚集位  
  390.         16,                                         // 16位 Z-缓存 (深度缓存)    
  391.         0,                                          // 无模板缓存  
  392.         0,                                          // 无辅助缓存  
  393.         PFD_MAIN_PLANE,                             // 主绘图层  
  394.         0,                                          // 保留  
  395.         0, 0, 0                                     // 忽略层遮罩  
  396.     };  
  397.       
  398.     if (!(hDC=GetDC(hWnd)))                         // 取得设备描述表了么?  
  399.     {  
  400.         KillGLWindow();                             // 重置显示区  
  401.         MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);  
  402.         return FALSE;                               // Return FALSE  
  403.     }  
  404.   
  405.     if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Windows 找到相应的象素格式了吗?  
  406.     {  
  407.         KillGLWindow();                             // Reset The Display  
  408.         MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);  
  409.         return FALSE;                               // Return FALSE  
  410.     }  
  411.   
  412.     if(!SetPixelFormat(hDC,PixelFormat,&pfd))       // 能够设置象素格式么?  
  413.     {  
  414.         KillGLWindow();                             // Reset The Display  
  415.         MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);  
  416.         return FALSE;                               // Return FALSE  
  417.     }  
  418.   
  419.     if (!(hRC=wglCreateContext(hDC)))               // 能否取得着色描述表?  
  420.     {  
  421.         KillGLWindow();                             // Reset The Display  
  422.         MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);  
  423.         return FALSE;                               // Return FALSE  
  424.     }  
  425.   
  426.     if(!wglMakeCurrent(hDC,hRC))                    // 尝试激活着色描述表  
  427.     {  
  428.         KillGLWindow();                             // Reset The Display  
  429.         MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);  
  430.         return FALSE;                               // Return FALSE  
  431.     }  
  432.   
  433.     ShowWindow(hWnd,SW_SHOW);                       // 显示窗口  
  434.     SetForegroundWindow(hWnd);                      // 略略提高优先级  
  435.     SetFocus(hWnd);                                 // 设置键盘的焦点至此窗口  
  436.     ReSizeGLScene(width, height);                   // 设置透视 GL 屏幕  
  437.   
  438.     if (!InitGL())                                  // 初始化新建的GL窗口  
  439.     {  
  440.         KillGLWindow();                             // Reset The Display  
  441.         MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);  
  442.         return FALSE;                               // Return FALSE  
  443.     }  
  444.   
  445.     return TRUE;                                    // Success  
  446. }  
  447.   
  448. LRESULT CALLBACK WndProc(   HWND    hWnd,           // 窗口的句柄  
  449.                             UINT    uMsg,           // 窗口的消息  
  450.                             WPARAM  wParam,         // 附加的消息内容  
  451.                             LPARAM  lParam)         // 附加的消息内容  
  452. {  
  453.     switch (uMsg)                                   // 检查Windows消息  
  454.     {  
  455.         case WM_ACTIVATE:                           // 监视窗口激活消息  
  456.         {  
  457.             if (!HIWORD(wParam))                    // 检查最小化状态  
  458.             {  
  459.                 active=TRUE;                        // Program Is Active  
  460.             }  
  461.             else  
  462.             {  
  463.                 active=FALSE;                       // Program Is No Longer Active  
  464.             }  
  465.   
  466.             return 0;                               // Return To The Message Loop  
  467.         }  
  468.   
  469.         case WM_SYSCOMMAND:                         // 中断系统命令Intercept System Commands  
  470.         {  
  471.             switch (wParam)                         // 检查系统调用Check System Calls  
  472.             {  
  473.                 case SC_SCREENSAVE:                 // 屏保要运行?  
  474.                 case SC_MONITORPOWER:               // 显示器要进入节电模式?  
  475.                 return 0;                           // 阻止发生  
  476.             }  
  477.             break;                                  // Exit  
  478.         }  
  479.   
  480.         case WM_CLOSE:                              // 收到Close消息?  
  481.         {  
  482.             PostQuitMessage(0);                     //  发出退出消息  
  483.             return 0;                               // Jump Back  
  484.         }  
  485.   
  486.         case WM_KEYDOWN:                            // 有键按下么?  
  487.         {  
  488.             keys[wParam] = TRUE;                    // 如果是,设为TRUE  
  489.             return 0;                               // Jump Back  
  490.         }  
  491.   
  492.         case WM_KEYUP:                              // 有键放开么?  
  493.         {  
  494.             keys[wParam] = FALSE;                   // If So, Mark It As FALSE  
  495.             return 0;                               // Jump Back  
  496.         }  
  497.   
  498.         case WM_SIZE:                               // Resize The OpenGL Window  
  499.         {  
  500.             ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));  // LoWord=Width, HiWord=Height  
  501.             return 0;                               // Jump Back  
  502.         }  
  503.     }  
  504.   
  505.     // 向 DefWindowProc传递所有未处理的消息  
  506.     return DefWindowProc(hWnd,uMsg,wParam,lParam);  
  507. }  
  508.   
  509. int WINAPI WinMain( HINSTANCE   hInstance,          // 实例  
  510.                     HINSTANCE   hPrevInstance,      // 前一个实例  
  511.                     LPSTR       lpCmdLine,          // 命令行参数  
  512.                     int         nCmdShow)           // 窗口显示状态  
  513. {  
  514.     MSG     msg;                                    // Windowsx消息结构  
  515.     BOOL    done=FALSE;                             // 用来退出循环的Bool 变量  
  516.   
  517.     // 提示用户选择运行模式  
  518.     if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?""Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)  
  519.     {  
  520.         fullscreen=FALSE;                           // Windowed Mode  
  521.     }  
  522.   
  523.     // 创建OpenGL窗口*****************************!!  
  524.     if (!CreateGLWindow("kingwise's OpenGL Framework",640,480,16,fullscreen))  
  525.     {  
  526.         return 0;                                   // Quit If Window Was Not Created  
  527.     }  
  528.   
  529.     while(!done)                                    // 保持循环直到 done=TRUE  
  530.     {  
  531.         if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))   // 有消息在等待吗?  
  532.         {  
  533.             if (msg.message==WM_QUIT)               // 收到退出消息?  
  534.             {  
  535.                 done=TRUE;                          // If So done=TRUE  
  536.             }  
  537.             else                                    // 不是,处理窗口消息  
  538.             {  
  539.                 TranslateMessage(&msg);             // 翻译消息  
  540.                 DispatchMessage(&msg);              // 发送消息  
  541.             }  
  542.         }  
  543.         else                                        // If There Are No Messages  
  544.         {  
  545.             // 绘制场景。监视ESC键和来自DrawGLScene()的退出消息  
  546.             if (active)                             // Program Active?  
  547.             {  
  548.                 if (keys[VK_ESCAPE])                // Was ESC Pressed?  
  549.                 {  
  550.                     done=TRUE;                      // ESC Signalled A Quit  
  551.                 }  
  552.                 else                                // 不是退出的时候,刷新屏幕  
  553.                 {  
  554.                     DrawGLScene();                  // 绘制场景  
  555.                     SwapBuffers(hDC);               // 交换缓存 (双缓存)  
  556.                 }  
  557.             }  
  558.   
  559.             if (keys[VK_F1])                        // F1键按下了么?  
  560.             {  
  561.                 keys[VK_F1]=FALSE;                  // 若是,使对应的Key数组中的值为 FALSE  
  562.                 KillGLWindow();                     // 销毁当前的窗口  
  563.                 fullscreen=!fullscreen;             // 切换 全屏 / 窗口 模式  
  564.                 // 重建 OpenGL 窗口  
  565.                 if (!CreateGLWindow("kingwise's OpenGL Framework",640,480,16,fullscreen))  
  566.                 {  
  567.                     return 0;                       // 如果窗口未能创建,程序退出  
  568.                 }  
  569.             }  
  570.         }  
  571.     }  
  572.   
  573.     // 关闭程序  
  574.     KillGLWindow();                                 // 销毁窗口  
  575.     return (msg.wParam);                            // 退出程序  
  576. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值