TestOpenGL

来源:互联网 发布:java产生随机数的代码 编辑:程序博客网 时间:2024/05/15 23:55
#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);void EnableOpenGL(HWND hwnd, HDC*, HGLRC*);void DisableOpenGL(HWND, HDC, HGLRC);static float g_val_ud = 0.0f;static float g_val_ud_rate = 0.1f;static float g_val_lr = 0.0f;static float g_val_lr_rate = 5.0f;static float g_val_ws = 0.0f;static float g_val_ws_rate = 0.1f;static float g_val_ad = 0.0f;static float g_val_ad_rate = 0.1f;static void DrawSomething(){    glTranslatef(0.0f, 0.0f, -2.0f); // 往屏幕内移动2个单位(即:Z轴负方向)    glRotatef(g_val_lr, 0.0f, 1.0f, 0.0f); // 绕中心线旋转(旋转方向符合右手定则)    // 中心线    glBegin(GL_LINES);    glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(0.0f, 1.0f, 0.0f);    glColor3f(1.0f, 0.5f, 1.0f);glVertex3f(0.0f, -1.0f, 0.0f);    glEnd();    float line_half_len = 0.2f;    // 黄色正方形    glPushMatrix();    glTranslatef(0.0f, 0.0f, line_half_len);    glBegin(GL_LINES);        glColor3f(1.0f, 1.0f, 0.0f);glVertex2f(0-line_half_len, line_half_len);glVertex2f(line_half_len, line_half_len);        glColor3f(1.0f, 1.0f, 0.0f);glVertex2f(0-line_half_len, 0-line_half_len);glVertex2f(line_half_len, 0-line_half_len);        glColor3f(1.0f, 1.0f, 0.0f);glVertex2f(0-line_half_len, line_half_len);glVertex2f(0-line_half_len, 0-line_half_len);        glColor3f(1.0f, 1.0f, 0.0f);glVertex2f(line_half_len, line_half_len);glVertex2f(line_half_len, 0-line_half_len);    glEnd();    glPopMatrix();    // 红色正方形    glPushMatrix();    glTranslatef(0.0f, 0.0f, 0-line_half_len);    glBegin(GL_LINES);        glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(0-line_half_len, line_half_len);glVertex2f(line_half_len, line_half_len);        glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(0-line_half_len, 0-line_half_len);glVertex2f(line_half_len, 0-line_half_len);        glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(0-line_half_len, line_half_len);glVertex2f(0-line_half_len, 0-line_half_len);        glColor3f(1.0f, 0.0f, 0.0f);glVertex2f(line_half_len, line_half_len);glVertex2f(line_half_len, 0-line_half_len);    glEnd();    glPopMatrix();    glBegin(GL_LINES);        glColor3f(0.0f, 1.0f, 0.0f);glVertex3f(0-line_half_len, line_half_len, 0-line_half_len);        glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(0-line_half_len, line_half_len, line_half_len);        glColor3f(0.0f, 1.0f, 0.0f);glVertex3f(line_half_len, line_half_len, 0-line_half_len);        glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(line_half_len, line_half_len, line_half_len);        glColor3f(0.0f, 1.0f, 0.0f);glVertex3f(0-line_half_len, 0-line_half_len, 0-line_half_len);        glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(0-line_half_len, 0-line_half_len, line_half_len);        glColor3f(0.0f, 1.0f, 0.0f);glVertex3f(line_half_len, 0-line_half_len, 0-line_half_len);        glColor3f(0.0f, 0.0f, 1.0f);glVertex3f(line_half_len, 0-line_half_len, line_half_len);    glEnd();    GLUquadric* quad = gluNewQuadric();    glPushMatrix();    glTranslatef(0.2f, 0.0f, 0.0f);    glColor3f(0.0f, 0.0f, 1.0f); //蓝色    gluSphere(quad,0.1,8,8);    glPopMatrix();    glPushMatrix();    glTranslatef(-0.2f, 0.0f, 0.0f);    glColor3f(1.0f, 0.5f, 0.5f); //粉色    gluSphere(quad,0.15,30,30);    glPopMatrix();    gluDeleteQuadric(quad);}int WINAPI WinMain(HINSTANCE hInstance,                   HINSTANCE hPrevInstance,                   LPSTR lpCmdLine,                   int nCmdShow){    WNDCLASSEX wcex;    HWND hwnd;    HDC hDC;    HGLRC hRC;    MSG msg;    BOOL bQuit = FALSE;    /* register window class */    wcex.cbSize = sizeof(WNDCLASSEX);    wcex.style = 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",                          "OpenGL Sample",                          WS_OVERLAPPEDWINDOW,                          CW_USEDEFAULT,                          CW_USEDEFAULT,                          512,                          512,                          NULL,                          NULL,                          hInstance,                          NULL);    ShowWindow(hwnd, nCmdShow);    /* enable OpenGL for the window */    EnableOpenGL(hwnd, &hDC, &hRC);    /* 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        {            /* OpenGL animation code goes here */            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);            glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);            glMatrixMode(GL_PROJECTION);            glLoadIdentity();            //glOrtho(-2.0,2.0f,-2.0f,2.0f,-10.0f,10.0f);            glFrustum(-2.0f,2.0f,-2.0f,2.0f,1.0f,10.0f);            glMatrixMode(GL_MODELVIEW);            glLoadIdentity();            gluLookAt(            g_val_ad, g_val_ud, -g_val_ws,            g_val_ad, g_val_ud, -g_val_ws-0.1f,            0.0f, 1.0f, 0.0f);            //glTranslatef(-g_val_ad,-g_val_ud,g_val_ws);            DrawSomething();            SwapBuffers(hDC);        }    }    /* 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_CLOSE:            PostQuitMessage(0);        break;        case WM_DESTROY:            return 0;        case WM_KEYDOWN:        {            switch (wParam)            {                case VK_ESCAPE:                    PostQuitMessage(0);                    break;                case VK_SPACE:                    g_val_ud = 0.0f;                    g_val_lr = 0.0f;                    g_val_ws = 0.0f;                    g_val_ad = 0.0f;                    break;                case VK_UP:                    g_val_ud += g_val_ud_rate;                    break;                case VK_DOWN:                    g_val_ud -= g_val_ud_rate;                    break;                case VK_LEFT:                    g_val_lr -= g_val_lr_rate;                    break;                case VK_RIGHT:                    g_val_lr += g_val_lr_rate;                    break;                case 'W':                    g_val_ws += g_val_ws_rate;                    break;                case 'S':                    g_val_ws -= g_val_ws_rate;                    break;                case 'A':                    g_val_ad -= g_val_ad_rate;                    break;                case 'D':                    g_val_ad += g_val_ad_rate;                    break;                default:                    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);    glEnable(GL_DEPTH_TEST);}void DisableOpenGL (HWND hwnd, HDC hDC, HGLRC hRC){    wglMakeCurrent(NULL, NULL);    wglDeleteContext(hRC);    ReleaseDC(hwnd, hDC);}

0 0
原创粉丝点击