几个opengl立方体绘制案例

您所在的位置:网站首页 opengl使用光照的四部操作 几个opengl立方体绘制案例

几个opengl立方体绘制案例

2023-07-25 04:36| 来源: 网络整理| 查看: 265

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 // 绘制立方体 // 将立方体的八个顶点保存到一个数组里面 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; ipalNumEntries = paletteSize; //建一个简单的RGB调色板 { int redMask = (1 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 #define GLUT_DISABLE_ATEXIT_HACK #include //#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 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 #include #include #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); //现在开始调协LIGHT0 glLightfv(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库和函数详解



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3