几个opengl立方体绘制案例
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立方体绘制案例相关推荐
- OpenGL 立方体贴图Cubemaps
OpenGL立方体贴图Cubemaps 立方体贴图Cubemaps简介 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 立方体贴图Cubemaps简介 我们已 ...
- OpenGL立方体贴图
OpenGL 立方贴图 Copyright NVIDIA Corporation, 1999. Commercial publication in written, electronic, or ot ...
- OpenGL 立方贴图
OpenGL 立方贴图 Copyright NVIDIA Corporation, 1999. Commercial publication in written, electronic, or ot ...
- 使用OpenGL 立方体贴图
openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.OpenGL 立方体贴图 二.使用步骤 1.代码 2.着色器程序 运行结果 注意 源码下载 参考 前言 对于室外3D 场景,通常 ...
- matlab 三维立方体绘制(边没有系数)
matlab 三维立方体绘制(边没有系数) x=load('xx.dat');%x中存立方体边的两端点x坐标,xx.dat第一列为边的第一个顶点的x坐标,%第二列为边的第二个顶点的x坐标,文件扩展名任 ...
- OpenGL ES 综合案例14:大长腿
OpenGL + OpenGL ES +Metal 系列文章汇总 本案例的目的在于理解大长腿效果的实现以及图片的保存 操作流程如下 最终的效果图如下 准备工作 准备工作主要有3部分 主控制器UI界面逻 ...
- LearnOpenGL 高级OpenGL—立方体贴图
文章目录 写在前面 立方体贴图 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 总结 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录 ...
- Learn OpenGL (八):颜色
当我们在OpenGL中创建一个光源时,我们希望给光源一个颜色.在上一段中我们有一个白色的太阳,所以我们也将光源设置为白色.当我们把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色(也就是 ...
- Learn OpenGL (六):坐标系统
为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model).观察(View).投影(Projection)三个矩阵.我们的顶点坐标起始于局部空间(Loca ...
最新文章
- python编程入门经典实例-【python】编程语言入门经典100例--30
- 移远NB-IOT模块的BC28与M26与BC26对比
- Android调试之tombstone信息的分析
- CCF 2015年题目题解 - Python
- JAVA服务治理实践之无侵入的应用服务监控--转
- 使用maven整合SSM框架详细步骤
- 安卓系统dicom阅读器_懒人追番利器,彩屏阅读器把动漫搬到手中
- 如何避免form提交进行页面跳转
- bbb u-boot 验证 emmc
- PyCharm 安装插件
- MySQL LIKE 子句
- lintcode:Number of Islands 岛屿的个数
- 评分卡模型开发(三)--数据集准备
- BW作为源系统连接时,激活DSO或其他模型时提示8*数据源不存在,无法激活
- SDNU 1210.通话记录
- 解决对象转json字符串时对象属性不按对象属性顺序的问题
- bugku-pokergame
- 智能家居设计原理c语言,基于51单片机智能家居系统设计
- python windows 下设置文件锁、多线程
- 懒惰、急躁和傲慢(Laziness, Impatience and hubris)