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

现代OpenGL中,如何使用不同图元类型画一个正方形? 在以往的OpenGL1.1版本中,要想画一个正方形是比较容易的,院校里大部分计算机图形学课程都是围绕1.1版本来讲的,但是过渡到现代OpenGL以后,画图方式与原先有了很大不同,其中一个重要变化就是图元类型,下面就来看看在现代OpenGL(本文使用4.3版本)中,如何使用不同的图元类型画一个正方形。首先对比一下新旧版本中图元类型的差异 图元类型 OpenGL1.1版枚举量 OpenGL4 阅读详情
#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(HWND, UINT, WPARAM, LPARAM);   // 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. }  


掌握OpenGL红蓝立体显示技术 OpenGL(Open Graphics Library)是一种广泛应用于计算机图形学领域的跨语言、跨平台的应用程序编程接口(API),专为渲染2D和3D矢量图形而设计。自1992年首次发布以来,OpenGL就以其高度的可移植性和对图形硬件的强大支持而闻名。通过本章,我们将深入了解OpenGL的基本概念、历史背景以及它在不同领域的广泛应用,从而为读者在图形学领域的深入研究和实践打下坚实的基础。 阅读详情

相关推荐

OpenGL 红蓝立体显示

红蓝显示,实现立体效果,比较简单,希望对你学习OPenGL有所帮助

OpenGL(七) 光照模型及设置

OpenGL把现实世界中的光照系统近似归为三部分,分别是光源、材质和光照环境。 光源就是光的来源,是“光”这种物质的提供者; 材质是指被光源照射的物体的表面的反射、漫反射(OpenGL不考虑折射)特性; 材质反映的是光照射到物体上后物体表现出来的对光的吸收、漫反射、反射等性能;  光照环境反应环境中所有光源发出的光经过无数次反射、漫反射之后整体环境所表现出来的光照效果。指定合适的光照

牧野的博客 4万+

红蓝3D立体图片-出屏效果不错

红蓝3D立体图片-出屏效果不错

OpenGL光照设置

光照模型 OpenGL光照模型分为三种光:Ambient Light 环境光, Diffuse Light漫反射光, Specular Light镜面反射光. 一、创建光源 void glLightfv (GLenum light, GLenum pname, const GLfloat *params) light: OpenGL提供8个光源 GL_LIGHT0 ~ GL_LIGHT7 pname: 光源属性 GL_AMBIENT 环境光 默认 (0.0, 0...

cfz751740465的博客 6835

红蓝3D测试图片

红蓝3D测试图片

一个关于红蓝眼镜能看的模型opengl代码

使用opengl开发的一个应用程序,有红蓝眼镜的可以下载下来看一看,

OpenGL 练习11.1 Lighting

#include #include #include /* ------------------------------- * v1[],v2[],v3[] {x,y,z} * -------------------------------*/ void norm(GLfloat v1[3], GLfloat v2[3], GLfloat v3[3], GLfloat *nor ) { G

SherrMoo 815

红蓝3D图片

红蓝3D图片,用于趣味网站、图像处理等。用红蓝眼镜观看。

OpenGL入门9——OpenGL光照

一、OpenGL光照模型 1、OpenGL假定光线是可以分解为红光、绿光、蓝光成分的; 2、人眼看到的物体颜色由环境中的光线和物体本身的材质属性共同决定; 3、光源的特征是由其发射的红、绿、蓝光的数量决定的; 4、材质的特征是由它向各个方向反射的红、绿、蓝入射光的百分比决定的; 5、OpenGL光照模型把光分为4种独立的成分:环境光、散射光、镜面光、发射光,4种成分都可以单独计算,并叠加

xiaoxiaoyusheng2012的专栏 1627

Lattice CrosslinkNx LIFCL-40实战解析:MIPI D-PHY硬核IP配置与CSI-2数据解析全流程

本文详细解析了Lattice CrosslinkNx LIFCL-40 FPGA中MIPI D-PHY硬核IP的配置与CSI-2数据解析全流程。通过实战案例,介绍了硬件环境搭建、寄存器配置、数据包结构解析及视频流重构技巧,帮助开发者快速掌握高速图像采集系统的设计与优化方法。

weixin_29159613的博客 198

MRST开源油藏模拟:从入门到精通的全流程指南

本文全面介绍了MRST开源油藏模拟工具的使用方法,从环境搭建到核心功能实战,再到性能优化和工业级应用。MRST作为一款基于MATLAB的开源工具,为油藏工程师提供了强大的数值模拟能力,特别适合教学和科研场景。文章还分享了二次开发技巧和常见问题解决方案,帮助读者快速掌握油藏模拟技术。

beer8的博客 326

PyOpengl学习(三):绘制点、线、面(上)

        今天我们来看一下在OpenGL中如何绘制点线面。        我们使用glBegin,和glEnd两个函数进行所要绘制图形的描述。绘制的内容要放在这两个函数之间。glBegin(GLenum mode); //给出数据点 glEnd();...

BigBoySunshine的专栏 5757

从零部署DeepSeek V4 Flash:NVIDIA DGX Spark实战指南

GPU加速计算已成为现代人工智能基础设施的核心,其原理是通过并行处理架构大幅提升深度学习模型的训练与推理效率。在AI工程实践中,NVIDIA GPU凭借CUDA生态和专用驱动栈,为大规模语言模型部署提供了硬件基础。本文聚焦于企业级AI服务器部署场景,针对NVIDIA DGX Spark多节点系统的硬件初始化、驱动兼容性配置、容器化部署等关键环节,提供从系统层到应用层的完整解决方案。通过vLLM推理框架的实战配置,演示如何将DeepSeek V4 Flash模型高效部署于多GPU环境,涵盖Tensor Par

weixin_32296621的博客 375

opengl进行绿色屏幕抠图

在进行一个AR项目,需要进行抠图,所以就用了一些抠图的方法,先展示一下抠图效果,如下: 抠图之前 抠图之后 蓝色背景 RGB值 : 0, 71, 187 CMYK : 90, 68, 0, 0 绿色背景 RGB值: 0, 177, 64 CMYK : 81, 0, 92, 0 RGB值转换成(0-1)之间,需要除以255 我们直接在fragment shader中进行抠图。 抠图算法方案一: keying_color = vec3(0.0, 0.6941177, 0.2509804)

XR风云 3309

STM32F4XX软件模拟I2C实现MPU6050姿态数据采集

本文详细介绍了在STM32F4XX平台上通过软件模拟I2C驱动MPU6050传感器实现姿态数据采集的完整方案。内容涵盖软件I2C的GPIO配置、核心通信函数实现、MPU6050寄存器配置详解以及数据读取处理流程,为硬件资源受限的嵌入式应用提供了灵活的解决方案,并分享了调试技巧与常见问题处理方法。

butter的博客 677

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(三)(含2022年和2023年)

此部分包含华为机试真题,方向是数字芯片,内容详细包括设计、验证、后端等,大部分题目给出参考答案。华为机试都是从题库里抽题目,所以这些题目还是很有参考性的,甚至是完全一样,可以搜到的。(题目内容较多,将分开编写几个文章)A.错误B.正确参考答案:BA.getB.try_getC.peekD.put参考答案:B。

qq_42135020的博客 1913

5.5 Opengl编程实例-红蓝三角形

5.5 Opengl编程实例-红蓝三角形

图形学与可视化 1514

YOLOv11改进策略【卷积层】| TIP 2025 MFA 多阶段特征聚合 大核扩感受 + 多梯度融合,强效增强弱小目标特征

红外弱小目标尺寸极小、信噪比低,在特征传递中极易丢失信息;常规卷积感受野单一、梯度源不足,难以同时捕捉局部细节与全局上下文,导致小目标特征表达弱、检测漏检。因此提出多阶段特征聚合 MFA,用大核卷积+多分支+通道注意力强化小目标特征提取。

Limiiiing的博客 581

使用OpenGL实现滤镜转换的一种思路

这儿定义的滤镜是一种表,输入源的每像素颜色,也就是RGB共256*256*256那么多种颜色,每种都能在滤镜表中找到一个替换色,从而实现画面观感的改变。 这里是一张滤镜表(64*64*64): 在OpenGL中,纹理颜色的定位规则和通常的数组操作不同。纹理无论宽高比例如何,有多长,有多宽,都是长为1,宽为1的一个对象,要定位纹理某个位置的颜色,需要使用比例的方式。 所以,在这里,RGB三个通道中, R控制可以去到纵向的第几面,这儿有64面,即整个纵向可以分为64份,第一分为0,最后一份为63,即

轮子初级玩家 688

关务管理项目专题:SAP 与关衡关务系统的进出口报关业务集成(1)需求和方案整理

一个拥有进出口业务的企业就需要报关,而关务系统就是用来辅助企业日常进出口报关,同时数字化、合规化报关业务的有效工具。本章属于关务管理项目专题系列,以 SAP 与关衡关务系统的进出口报关业务集成为实例,详细讲解报关业务的需求和方案整理。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 2075

08 RK3568 MAC TO MAC直连 RTL8367S mdio

本文:采用rk3568 gamc0 通过rgmii直连 交换芯片的mac口 通信方法为mdio。

qq_39451352的博客 3474

【JAVA】OPENGL绕XYZ轴旋转立体图效果

【代码】【JAVA】OPENGL绕XYZ轴旋转立体图效果。

544

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【OpenGL】复杂光照

本文介绍高光蒙版、点光源、聚光灯以及着色器的简单封装

WaWaJie的博客 1208

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Visual Pinball渲染技术对比:DirectX、OpenGL和bgfx的性能分析

Visual Pinball作为一款开源的弹珠台模拟器,在渲染技术方面经历了多次重大演进。从最初的DirectX 9到OpenGL,再到最新的bgfx渲染后端,每个版本都带来了显著的性能提升和新功能支持。本文将深入分析这三种渲染技术的性能差异,帮助用户选择最适合自己需求的版本。😊 ## 渲染技术演进历程 Visual Pinball的渲染技术发展可以分为三个主要阶段: ### 1. Dir

gitblog_00288的博客 596

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

音视频开发-OpenGL概念理解

顶点着色器 Vertex shader 相当于告诉opengl图形的顶点,由此得知形状,才能进一步进行填充颜色等等。相当于一个骨架 顶点着色器的计算也是由GPU负责 片元着色器 Fragment shader 也称之为片段着色器,像素着色器,对每个像素的显示进行处理,即一张图片,有很多像素点,每个像素点都需要经过片元着色器才能进行显示,所以需要大量计算,故使用GPU进行计算,而CPU擅长判断(基于...

CaicaiNo.1 5016

OpenGL入门

除此之外,我还发现了其他的书籍,不过不确定有没有中文版。名字是:learn opengl-graphics programming。经典的有红蓝宝书,不过一本便库函数索引,不太适合作入门;另一本理论知识点介绍多,适合入门。后面可能空了会对此书作阅读记录。

阿呆 158
上一篇: 光照只有叠加,没有覆盖
下一篇: 引用文章的右上标记
Savitch
博客等级 码龄16年 84粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值