1. 程式人生 > >幾個opengl立方體繪制案例

幾個opengl立方體繪制案例

arc ips 立方體 box rman kobject struct round board

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


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


下面的demoproject
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);  
} 

建立一個Win32project,如圖;樣例一是控制臺project。

技術分享

效果;

技術分享


遇到例如以下錯誤。

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);
 //如今開始調協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庫和函數具體解釋

幾個opengl立方體繪制案例