VC6 下载
http://blog.csdn.net/bcbobo21cn/article/details/44200205

opengl环境配置
http://blog.csdn.net/bcbobo21cn/article/details/51044614#t4

以下的demo工程
http://pan.baidu.com/s/1mhT1FIw

一  OpenGL 绘制一个立方体

代码

#include<GL/glut.h>// 绘制立方体// 将立方体的八个顶点保存到一个数组里面 static const float vertex_list[][3] =
{ -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
}; // 将要使用的顶点的序号保存到一个数组里面 static const GLint index_list[][2] =
{ {0, 1},    {2, 3},    {4, 5},    {6, 7},    {0, 2},    {1, 3},    {4, 6},    {5, 7},{0, 4},{1, 5},{7, 3},{2, 6}
}; // 绘制立方体void DrawCube(void)
{int i,j;glBegin(GL_LINES); for(i=0; i<12; ++i) // 12 条线段{for(j=0; j<2; ++j) // 每条线段 2个顶点{glVertex3fv(vertex_list[index_list[i][j]]);     }}glEnd();
}static float rotate = 0;
static int times = 0;void renderScene(void)
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW); glLoadIdentity();glPushMatrix();//glTranslatef(-0.2, 0, 0); // 平移//glScalef(2, 1, 1);    // 缩放times++;if(times > 100){times = 0;}if(times % 100 == 0){rotate += 0.3;}glRotatef(rotate, 0, 1, 0);glRotatef(rotate, 1, 0, 0);glColor3f(0, 0, 1);DrawCube();glPopMatrix();glutSwapBuffers();
}void main(int argc, char **argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);glutInitWindowPosition(100,100);glutInitWindowSize(500, 500);glutCreateWindow("GLDemo");glutDisplayFunc(renderScene);glutIdleFunc(renderScene);glutMainLoop();
}

效果;随时间而动;

glVertex函数用在glBegin和glEnd之间,除此以外没有意义。用来指定点、线和多边形的顶点。当调用glVertex时,可以为该顶点指定颜色、法线量和纹理坐标。当只指定x,y时,z缺省为0.0,w缺省为1.0;当只指定x、y和z时,w缺省为1.0。

二 3D旋转立方体

代码

/** * function:动态3D立方体 */
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>  char *className = "OpenGL";
char *windowName = "OpenGL Cube";
int winX = 0, winY = 0;
int winWidth = 300, winHeight = 300;
HDC hDC;
HGLRC hGLRC;
HPALETTE hPalette;
void init(void){  //设置视图投影  glMatrixMode(GL_PROJECTION);  glFrustum(-0.5F,0.5F,-0.5F,0.5F,1.0F,3.0F);  //视区定位  glMatrixMode(GL_MODELVIEW);  glTranslatef(0.0F,0.0F,-2.0F);  //物体定位  glRotatef(30.0F,1.0F,0.0F,0.0F);  glRotatef(30.0F,0.0F,1.0F,0.0F);  glEnable(GL_DEPTH_TEST);  glEnable(GL_LIGHTING);  glEnable(GL_LIGHT0);
}
void redraw(HDC hDC){  //清除颜色和深度缓冲区  //glClearColor(1.0f, 0.0f, 0.0f, 0.0f);  //glClearDepth(2.0);  glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);  //画立方体的6个面  glBegin(GL_QUADS);  glNormal3f( 0.0F, 0.0F, 1.0F);  glVertex3f( 0.5f, 0.5f, 0.5f);  glVertex3f(-0.5f, 0.5f, 0.5f);  glVertex3f(-0.5f,-0.5f, 0.5f);  glVertex3f( 0.5f,-0.5f, 0.5f);  //1----------------------------  glNormal3f( 0.0F, 0.0F,-1.0F);  glVertex3f(-0.1f,-0.5f,-0.5f);  glVertex3f(-0.5f, 0.5f,-0.5f);  glVertex3f( 0.5f, 0.5f,-0.5f);  glVertex3f( 0.5f,-0.5f,-0.5f);  //2----------------------------  glNormal3f( 0.0F, 1.0F, 0.0F);  glVertex3f( 0.5f, 0.5f, 0.5f);  glVertex3f( 0.5f, 0.5f,-0.5f);  glVertex3f(-0.5f, 0.5f,-0.5f);  glVertex3f(-0.5f, 0.5f, 0.5f);  //3----------------------------  glNormal3f( 0.0F,-1.0F, 0.0F);  glVertex3f(-0.5f,-0.5f,-0.5f);  glVertex3f( 0.5f,-0.5f,-0.5f);  glVertex3f( 0.5f,-0.5f, 0.5f);  glVertex3f(-0.5f,-0.5f, 0.5f);  //4----------------------------  glNormal3f( 1.0F, 0.0F, 0.0F);  glVertex3f( 0.5f, 0.5f, 0.5f);  glVertex3f( 0.5f,-0.5f, 0.5f);  glVertex3f( 0.5f,-0.5f,-0.5f);  glVertex3f( 0.5f, 0.5f,-0.5f);  //5----------------------------  glNormal3f(-1.0F, 0.0F, 0.0F);  glVertex3f(-0.5f,-0.5f,-0.5f);  glVertex3f(-0.5f,-0.5f, 0.5f);  glVertex3f(-0.5f, 0.5f, 0.5f);  glVertex3f(-0.5f, 0.5f,-0.5f);  //6----------------------------*/  glEnd();  SwapBuffers(hDC);
}
void resize(void){  //设置视区,使之覆盖整个窗口  glViewport(0,0,winWidth,winHeight);
}
void setupPixelFormat(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);//确定pfd结构是否存在  SetPixelFormat(*hDC, iFormat, &pfd);  /* create and enable the render context (RC) */  *hRC = wglCreateContext(*hDC);  wglMakeCurrent(*hDC, *hRC);  /*if(iFormat == 0){ MessageBox(WindowFromDC(hDC),"ChoosePixelFormat failed.", "Error",MB_ICONERROR|MB_OK); exit(1); } if(SetPixelFormat(hDC,iFormat,&pfd)!=TRUE){ MessageBox(WindowFromDC(hDC),"SetPixelFormat failed.", "Error",MB_ICONERROR|MB_OK); exit(1); }*/
}
void setupPalette(HDC hDC){  int pixelFormat = GetPixelFormat(hDC);  PIXELFORMATDESCRIPTOR pfd;  LOGPALETTE* pPal;  int paletteSize;  DescribePixelFormat(hDC,pixelFormat,  sizeof(PIXELFORMATDESCRIPTOR),&pfd);  if(pfd.dwFlags & PFD_NEED_PALETTE){  paletteSize = 1 << pfd.cColorBits;  }  else{  return ;  }  pPal = (LOGPALETTE*)malloc(sizeof(LOGPALETTE)+paletteSize*sizeof(PALETTEENTRY));  pPal->palVersion=0x300;  pPal->palNumEntries = paletteSize;  //建一个简单的RGB调色板  {  int redMask = (1 << pfd.cRedBits) - 1;  int greemMask = (1 << pfd.cGreenBits) - 1;  int blueMask = (1 << pfd.cBlueBits) - 1;  int i;  for(i=0;i<paletteSize;i++){  pPal->palPalEntry[i].peRed =  (((i >> pfd.cRedShift) & redMask) * 255)/greemMask;  //pPal->palPalEntry[i]-peGreen =  }  }  }  LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
void EnableOpenGL(HWND hwnd, HDC*, HGLRC*);
void DisableOpenGL(HWND, HDC, HGLRC);  int WINAPI WinMain(HINSTANCE hInstance,  HINSTANCE hPrevInstance,  LPSTR lpCmdLine,  int nCmdShow)
{  WNDCLASSEX wcex;  HWND hwnd;  HDC hDC;  HGLRC hRC;  MSG msg;  BOOL bQuit = FALSE;  float theta = 0.0f;  /* register window class */  wcex.cbSize = sizeof(WNDCLASSEX);  wcex.style = CS_HREDRAW|CS_VREDRAW;//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",  windowName,//"OpenGL Sample",  WS_OVERLAPPEDWINDOW/*后面是后来加的*/|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,  winX,//CW_USEDEFAULT,  winY,//CW_USEDEFAULT,  winWidth,//256,  winHeight,//256,  NULL,  NULL,  hInstance,  NULL);  ShowWindow(hwnd, nCmdShow);  /* enable OpenGL for the window */  //setupPixelFormat(hwnd, &hDC, &hRC);  EnableOpenGL(hwnd, &hDC, &hRC);  init();  /* 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 if(0)  {  /* OpenGL animation code goes here */  glClearColor(0.5f, 1.0f, 0.5f, 0.5f);  glClear(GL_COLOR_BUFFER_BIT);  glPushMatrix();  glRotatef(theta, 0.0f, 0.0f, 1.0f);  glBegin(GL_TRIANGLES);  glColor3f(0.5f, 5.0f, 1.0f);   glVertex2f(0.0f,   1.0f);  glColor3f(0.0f, 1.0f, 0.0f);   glVertex2f(0.87f,  -0.5f);  glColor3f(1.0f, 5.0f, 0.5f);   glVertex2f(-0.87f, -0.5f);  glEnd();  glPopMatrix();  SwapBuffers(hDC);  theta += 1.0f;  //Sleep (1);  }  else{  glPushMatrix();  glRotatef(theta, 0.0f, 0.0f, 1.0f);  redraw(hDC);//立方体  需要初始化init()函数  glPopMatrix();  theta += 1.0f;  }  }  /* 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_CREATE: hDC = GetDC(hwnd); setupPalette(hDC); hGLRC=wglCreateContext(hDC); wglMakeCurrent(hDC,hGLRC); init(); return 0;*/  case WM_CLOSE:  PostQuitMessage(0);  break;  case WM_DESTROY:  /*//------------------ if(hGLRC){ wglMakeCurrent(NULL,NULL); wglDeleteContext(hGLRC); } if(hPalette){ DeleteObject(hPalette); } ReleaseDC(hwnd,hDC); PostQuitMessage(0); //====================*/  return 0;  //------------------------  case WM_SIZE:  //跟踪窗口大小改变  hGLRC=(struct HGLRC__ *)1;  if(hGLRC){  winWidth=(int)LOWORD(lParam);  winHeight=(int)LOWORD(lParam);  resize();  return 0;  }  case WM_PALETTECHANGED:  //如果它不是当前窗口,则实现调色板与hDC的对应  if(hGLRC && hPalette && (HWND) wParam != hwnd){  UnrealizeObject(hPalette);  SelectPalette(hDC,hPalette,FALSE);  //ReadlizePalette(hDC);  redraw(hDC);  break;  }  break;  //=========================  case WM_KEYDOWN:  {  switch (wParam)  {  case VK_ESCAPE:  PostQuitMessage(0);  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);
}  void DisableOpenGL (HWND hwnd, HDC hDC, HGLRC hRC)
{  wglMakeCurrent(NULL, NULL);  wglDeleteContext(hRC);  ReleaseDC(hwnd, hDC);
} 

建立一个Win32工程,如图;例子一是控制台工程;

效果;

遇到如下错误;

lftdemo2.cpp
e:\dddd13\opengl立方体demo\lftdemo2\lftdemo2.cpp(308) : error C2440: '=' : cannot convert from 'const int' to 'struct HGLRC__ *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
执行 cl.exe 时出错.


hGLRC=1;

改为
hGLRC=(struct HGLRC__ *)1;

GL_QUADS:绘制由四个顶点组成的一组单独的四边形。顶点4n-3、4n-2、4n-1和4n定义了第n个四边形。总共绘制N/4个四边形

三 3D颜色立方体

代码:

#include <stdio.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include <gl/glut.h>
//#pragma comment(lib, "glut32.lib")  GLfloat AngleX;
GLfloat AngleY;  void display(void)
{  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  glMatrixMode(GL_MODELVIEW);  glLoadIdentity();  glPushMatrix();  {  glRotatef(AngleX,1.0f,0.0f,0.0f);  glRotatef(AngleY,0.0f,1.0f,0.0f);  glBegin(GL_POLYGON); //前表面  glColor3ub((GLubyte)255,(GLubyte)255,(GLubyte)255);//颜色设置为白色  glVertex3f(50.0f,50.0f,50.0f);  glColor3ub((GLubyte)255,(GLubyte)255,(GLubyte)0);//颜色设置为黄色  glVertex3f(50.0f,-50.0f,50.0f);  glColor3ub((GLubyte)255,(GLubyte)0,(GLubyte)0);//颜色设置为红色  glVertex3f(-50.0f,-50.0f,50.0f);  glColor3ub((GLubyte)255,(GLubyte)0,(GLubyte)255);//颜色设置为白色  glVertex3f(-50.0f,50.0f,50.0f);  glEnd();  glBegin(GL_POLYGON); //后表面  glColor3f(0.0f,1.0f,1.0f);//颜色设置为青色  glVertex3f(50.0f,50.0f,-50.0f);  glColor3f(0.0f,1.0f,0.0f);//颜色设置为绿色  glVertex3f(50.0f,-50.0f,-50.0f);  glColor3f(0.0f,0.0f,0.0f);//颜色设置为黑色  glVertex3f(-50.0f,-50.0f,-50.0f);  glColor3f(0.0f,0.0f,1.0f);//颜色设置为蓝色  glVertex3f(-50.0f,50.0f,-50.0f);  glEnd();  glBegin(GL_POLYGON); //上表面  glColor3d(0.0,1.0,1.0);//颜色设置为青色  glVertex3f(50.0f,50.0f,-50.0f);  glColor3d(1.0,1.0,1.0);//颜色设置为白色  glVertex3f(50.0f,50.0f,50.0f);  glColor3d(1.0,0.0,1.0);//颜色设置为品红色  glVertex3f(-50.0f,50.0f,50.0f);  glColor3d(0.0,0.0,1.0);//颜色设置为蓝色  glVertex3f(-50.0f,50.0f,-50.0f);  glEnd();  glBegin(GL_POLYGON); //下表面  glColor3ub(0u,255u,0u);//颜色设置为绿色  glVertex3f(50.0f,-50.0f,-50.0f);  glColor3ub(255u,255u,0u);//颜色设置为黄色  glVertex3f(50.0f,-50.0f,50.0f);  glColor3ub(255u,0u,0u);//颜色设置为红色  glVertex3f(-50.0f,-50.0f,50.0f);  glColor3ub(0u,0u,0u);//颜色设置为黑色  glVertex3f(-50.0f,-50.0f,-50.0f);  glEnd();  glBegin(GL_POLYGON); //左表面  glColor3ub((GLubyte)255,(GLubyte)255,(GLubyte)255);//颜色设置为白色  glVertex3f(50.0f,50.0f,50.0f);  glColor3ub((GLubyte)0,(GLubyte)255,(GLubyte)255);//颜色设置为青色  glVertex3f(50.0f,50.0f,-50.0f);  glColor3ub((GLubyte)0,(GLubyte)255,(GLubyte)0);//颜色设置为绿色  glVertex3f(50.0f,-50.0f,-50.0f);  glColor3ub((GLubyte)255,(GLubyte)255,(GLubyte)0);//颜色设置为黄色  glVertex3f(50.0f,-50.0f,50.0f);  glEnd();  glBegin(GL_POLYGON); //右表面  glColor3f(1.0f,0.0f,1.0f);//颜色设置为品红色  glVertex3f(-50.0f,50.0f,50.0f);  glColor3f(0.0f,0.0f,1.0f);//颜色设置为蓝色  glVertex3f(-50.0f,50.0f,-50.0f);  glColor3f(0.0f,0.0f,0.0f);//颜色设置为黑色  glVertex3f(-50.0f,-50.0f,-50.0f);  glColor3f(1.0f,0.0f,0.0f);//颜色设置为红色  glVertex3f(-50.0f,-50.0f,50.0f);  glEnd();  }  glPopMatrix();  glutSwapBuffers();
}  void reshape(int w, int h)
{  GLfloat aspect = (GLfloat)w / (GLfloat)h;  GLfloat nRange = 100.0f;  glViewport(0,0,w,h);  glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式  glLoadIdentity();  //设置三维投影区  if (w<=h)  {  glOrtho(-nRange, nRange, -nRange * aspect, nRange * aspect, -nRange, nRange);  }   else  {  glOrtho(-nRange, nRange, -nRange / aspect, nRange / aspect, -nRange, nRange);  }
}  void key_board(GLint key,GLint x,GLint y)
{  if(key == GLUT_KEY_UP)  {  AngleX -= 5.0f;  }  if(key == GLUT_KEY_DOWN)  {  AngleX += 5.0f;  }  if(key == GLUT_KEY_LEFT)  {  AngleY -= 5.0f;  }  if(key == GLUT_KEY_RIGHT)  {  AngleY += 5.0f;  }  if(AngleX > 355.0f)  {  AngleX = 0.0f;  }  if(AngleX < 0.0f)  {  AngleX = 355.0f;  }  if(AngleY > 355.0f)  AngleY = 0.0f;  if(AngleY < 0.0f)  {  AngleY = 355.0f;  }  glutPostRedisplay();
}  void init()
{  AngleX = 45.0f;  AngleY = 315.0f;  glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  glEnable(GL_DEPTH_TEST);  glEnable(GL_DITHER);  glShadeModel(GL_SMOOTH);
}
void main(int argc,char* argv[])
{  glutInit(&argc,argv);  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);  glutInitWindowSize(480,480);  glutCreateWindow("OpenGL颜色立方体");  glutReshapeFunc(reshape);  glutDisplayFunc(display);  glutSpecialFunc(key_board); //设置处理特殊击键的回调函数  init();  glutMainLoop();
}

效果:

四 光照立方体效果

代码:

#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>  #define WIN32_LEAN_AND_MEAN//#pragma comment(lib, "openGL32.lib")
//#pragma comment(lib, "glu32.lib")
//#pragma comment(lib, "glaux.lib")
float angle=0.0f;
HDC g_HDC;
float legAngle[2]={0.0f,0.0f};
float armAngle[2]={0.0f,0.0f};
float ambientLight[]={0.1f,0.3f,0.8f,1.0f};  //环境光
float diffuseLight[]={0.25f,0.25f,0.25f,1.0f}; //散射光
float lightPosition[]={0.0f,0.0f,1.0f,0.0f}; //光源位置
//材质变量
float matAmbient[]={1.0f,1.0f,1.0f,1.0f};
float matDiff[]={1.0f,1.0f,1.0f,1.0f};
//初始化
void Initialize()
{glClearColor(0.0f,0.0f,0.0f,0.0f);   //清理颜色为黑色glShadeModel(GL_SMOOTH);     //使用平滑明暗处理glEnable(GL_DEPTH_TEST);     //剔除隐藏面glEnable(GL_CULL_FACE);      //不计算多边形背面glFrontFace(GL_CCW);      //多边形逆时针方向为正面glEnable(GL_LIGHTING);      //启用光照//为LIGHT0设置析质glMaterialfv(GL_FRONT,GL_AMBIENT,matAmbient);glMaterialfv(GL_FRONT,GL_DIFFUSE,matDiff);//现在开始调协LIGHT0glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); //设置环境光分量glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); //设置散射光分量glLightfv(GL_LIGHT0,GL_POSITION,lightPosition); //设置光源在场景中的位置//启用光glEnable(GL_LIGHT0);
}
//绘制单位立方体
void DrawCube(float xPos,float yPos,float zPos)
{glPushMatrix();glTranslatef(xPos,yPos,zPos);glBegin(GL_QUADS);    //顶面glNormal3f(0.0f,1.0f,0.0f);glVertex3f(0.5f,0.5f,0.5f);glVertex3f(0.5f,0.5f,-0.5f);glVertex3f(-0.5f,0.5f,-0.5f);glVertex3f(-0.5f,0.5f,0.5f);glEnd();glBegin(GL_QUADS);    //底面glNormal3f(0.0f,-1.0f,0.0f);glVertex3f(0.5f,-0.5f,0.5f);glVertex3f(-0.5f,-0.5f,0.5f);glVertex3f(-0.5f,-0.5f,-0.5f);glVertex3f(0.5f,-0.5f,-0.5f);glEnd();glBegin(GL_QUADS);    //前面glNormal3f(0.0f,0.0f,1.0f);glVertex3f(0.5f,0.5f,0.5f);glVertex3f(-0.5f,0.5f,0.5f);glVertex3f(-0.5f,-0.5f,0.5f);glVertex3f(0.5f,-0.5f,0.5f);glEnd();glBegin(GL_QUADS);    //背面glNormal3f(0.0f,0.0f,-1.0f);glVertex3f(0.5f,0.5f,-0.5f);glVertex3f(0.5f,-0.5f,-0.5f);glVertex3f(-0.5f,-0.5f,-0.5f);glVertex3f(-0.5f,0.5f,-0.5f);glEnd();glBegin(GL_QUADS);    //左面glNormal3f(-1.0f,0.0f,0.0f);glVertex3f(-0.5f,0.5f,0.5f);glVertex3f(-0.5f,0.5f,-0.5f);glVertex3f(-0.5f,-0.5f,-0.5f);glVertex3f(-0.5f,-0.5f,0.5f);glEnd();glBegin(GL_QUADS);    //右面glNormal3f(1.0f,0.0f,0.0f);glVertex3f(0.5f,0.5f,0.5f);glVertex3f(0.5f,-0.5f,0.5f);glVertex3f(0.5f,-0.5f,-0.5f);glVertex3f(0.5f,0.5f,-0.5f);glEnd();glPopMatrix();
}
//处理场景的绘制
void Render()
{glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //清理颜色/深度缓存glLoadIdentity();     //复位旋转角度计数器angle=angle+0.1f;     //递增旋转角度计数器if(angle>=360.0f)     //如果已旋转一周,复位计数器angle=0.0f;glTranslatef(0.0f,0.0f,-3.0f);glRotatef(angle,1.0f,0.0f,0.0f);glRotatef(angle,0.0f,1.0f,0.0f);glRotatef(angle,0.0f,0.0f,1.0f);DrawCube(0.0f,0.0f,0.0f);glFlush();       SwapBuffers(g_HDC);     //交换前后缓存
}
//为设备环境设置像素格式的函数
void SetupPixelFormat(HDC hDC)
{int nPixelFormat;static PIXELFORMATDESCRIPTOR pfd={sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,32,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,PFD_MAIN_PLANE,0,0,0,0};nPixelFormat=ChoosePixelFormat(hDC,&pfd);SetPixelFormat(hDC,nPixelFormat,&pfd);
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{static HGLRC hRC;static HDC hDC;int width,height;switch(message){case WM_CREATE:hDC=GetDC(hwnd);g_HDC=hDC;SetupPixelFormat(hDC);hRC=wglCreateContext(hDC);wglMakeCurrent(hDC,hRC);return 0;break;case WM_CLOSE:wglMakeCurrent(hDC,NULL);wglDeleteContext(hRC);PostQuitMessage(0);return 0;break;case WM_SIZE:height=HIWORD(lParam);width=LOWORD(lParam);if(height==0)height=1;glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(54.0f,(GLfloat)width/(GLfloat)height,1.0f,1000.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();return 0;break;default:break;}return (DefWindowProc(hwnd,message,wParam,lParam));
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{WNDCLASSEX windowClass;HWND hwnd;MSG msg;bool done;int width=800;int height=600;int bits=32;windowClass.cbSize=sizeof(WNDCLASSEX);windowClass.style=CS_HREDRAW|CS_VREDRAW;windowClass.lpfnWndProc=WndProc;windowClass.cbClsExtra=0;windowClass.cbWndExtra=0;windowClass.hInstance=hInstance;windowClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);windowClass.hCursor=LoadCursor(NULL,IDC_ARROW);windowClass.hbrBackground=NULL;windowClass.lpszMenuName=NULL;windowClass.lpszClassName="MyClass";windowClass.hIconSm=LoadIcon(NULL,IDI_WINLOGO);if(!RegisterClassEx(&windowClass))return 0;hwnd=CreateWindowEx(WS_EX_APPWINDOW|WS_EX_WINDOWEDGE,"MyClass","OpenGL Cube",WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,0,0,800,600,NULL,NULL,hInstance,NULL);if(!hwnd)return 0;ShowWindow(hwnd,SW_SHOW);UpdateWindow(hwnd);Initialize();  //初始化绘制环境done=false;while(!done){PeekMessage(&msg,hwnd,NULL,NULL,PM_REMOVE);if(msg.message==WM_QUIT){done=true;}else{Render();TranslateMessage(&msg);DispatchMessage(&msg);}}return msg.wParam;
}

效果:

五 链接

http://blog.csdn.net/djl4104804/article/details/8131072
opengl库和函数详解

几个opengl立方体绘制案例相关推荐

  1. OpenGL 立方体贴图Cubemaps

    OpenGL立方体贴图Cubemaps 立方体贴图Cubemaps简介 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 立方体贴图Cubemaps简介 我们已 ...

  2. OpenGL立方体贴图

    OpenGL 立方贴图 Copyright NVIDIA Corporation, 1999. Commercial publication in written, electronic, or ot ...

  3. OpenGL 立方贴图

    OpenGL 立方贴图 Copyright NVIDIA Corporation, 1999. Commercial publication in written, electronic, or ot ...

  4. 使用OpenGL 立方体贴图

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.OpenGL 立方体贴图 二.使用步骤 1.代码 2.着色器程序 运行结果 注意 源码下载 参考 前言 对于室外3D 场景,通常 ...

  5. matlab 三维立方体绘制(边没有系数)

    matlab 三维立方体绘制(边没有系数) x=load('xx.dat');%x中存立方体边的两端点x坐标,xx.dat第一列为边的第一个顶点的x坐标,%第二列为边的第二个顶点的x坐标,文件扩展名任 ...

  6. OpenGL ES 综合案例14:大长腿

    OpenGL + OpenGL ES +Metal 系列文章汇总 本案例的目的在于理解大长腿效果的实现以及图片的保存 操作流程如下 最终的效果图如下 准备工作 准备工作主要有3部分 主控制器UI界面逻 ...

  7. LearnOpenGL 高级OpenGL—立方体贴图

    文章目录 写在前面 立方体贴图 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 总结 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录 ...

  8. Learn OpenGL (八):颜色

    当我们在OpenGL中创建一个光源时,我们希望给光源一个颜色.在上一段中我们有一个白色的太阳,所以我们也将光源设置为白色.当我们把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色(也就是 ...

  9. Learn OpenGL (六):坐标系统

    为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model).观察(View).投影(Projection)三个矩阵.我们的顶点坐标起始于局部空间(Loca ...

最新文章

  1. python编程入门经典实例-【python】编程语言入门经典100例--30
  2. 移远NB-IOT模块的BC28与M26与BC26对比
  3. Android调试之tombstone信息的分析
  4. CCF 2015年题目题解 - Python
  5. JAVA服务治理实践之无侵入的应用服务监控--转
  6. 使用maven整合SSM框架详细步骤
  7. 安卓系统dicom阅读器_懒人追番利器,彩屏阅读器把动漫搬到手中
  8. 如何避免form提交进行页面跳转
  9. bbb u-boot 验证 emmc
  10. PyCharm 安装插件
  11. MySQL LIKE 子句
  12. lintcode:Number of Islands 岛屿的个数
  13. 评分卡模型开发(三)--数据集准备
  14. BW作为源系统连接时,激活DSO或其他模型时提示8*数据源不存在,无法激活
  15. SDNU 1210.通话记录
  16. 解决对象转json字符串时对象属性不按对象属性顺序的问题
  17. bugku-pokergame
  18. 智能家居设计原理c语言,基于51单片机智能家居系统设计
  19. python windows 下设置文件锁、多线程
  20. 懒惰、急躁和傲慢(Laziness, Impatience and hubris)

热门文章

  1. 阿拉伯数字小写金额转换成中文大写金C额程序说明
  2. python socket connect 阻塞_python 网络编程(socketserver,阻塞,其他方法)
  3. 【MMDblender】MMD烘焙后导入blender贴图颜色错乱问题
  4. 机智云AIoT开发平台,物联网开发和运营从未如此简单
  5. 【VSCode】提升效率
  6. 扇贝一面----Android面经
  7. 在网络中狂奔:KCP协议
  8. 【栈】实现高级计算器
  9. Echarts绘制地图,且可以下钻到省区
  10. 如何在线批量转换图片格式为jpg?