游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1391|回复: 1

关于深度缓存的问题?

[复制链接]

2

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-3-28 11:28:00 | 显示全部楼层 |阅读模式
程序本身是想通过空格键打开或者关闭深度测试,来观察在立方体里的球体,但最后运行却看不到效果,这是为什么啊?源代码如下:

#include <windows.h>                                        // standard Windows app include
#include <math.h>
#include <gl/gl.h>                                                // standard OpenGL include
#include <gl/glu.h>                                                // OpenGL utilties
#include <gl/glaux.h>                                        // OpenGL auxiliary functions

////// Global Variables
float angle = 0.0f;                                                // current angle of the rotating triangle
HDC g_HDC;                                                                // global device context
bool fullScreen = false;                                // true = fullscreen; false = windowed
bool keyPressed[256];                                        // holds true for keys that are pressed

bool cuttingPlane = true;                                // true: cutting plane is enabled

// Initialize
// desc: initializes OpenGL
void Initialize()
{
        glEnable(GL_DEPTH_TEST);                        // enable the depth buffer
        glEnable(GL_CULL_FACE);                                // cull hidden faces
        glEnable(GL_LIGHTING);                                // enable lighting
        glEnable(GL_LIGHT0);                                // enable light0
        glEnable(GL_COLOR_MATERIAL);                // set material to colors
        glShadeModel(GL_SMOOTH);                        // enable smooth shading
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);         // Clear background to black
}

// Render
// desc: handles drawing of scene
void Render()
{
        // clear screen and depth buffer
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);                                                                               
        glLoadIdentity();

        angle += 0.2f;                        // increase rotation angle

        // move scene back and rotate about the y-axis
        glTranslatef(0.0f, 0.0f, -100.0f);

        // first draw the solid sphere inside the cube
        glPushMatrix();
                glRotatef(angle, 0.0f, 1.0f, 0.0f);
                glColor3f(1.0f, 1.0f, 0.0f);
                auxSolidSphere(5.0f);
        glPopMatrix();

        // second draw the solid cube
        glPushMatrix();
                glRotatef(angle, 1.0f, 0.0f, 0.0f);
                //glRotatef(angle, 0.0f, 1.0f, 0.0f);
                //glRotatef(angle, 0.0f, 0.0f, 1.0f);

                // draw the cutting plane if cutting is enabled
                // on one side of the cube
                if (cuttingPlane)
                {
                        glDrawBuffer(GL_NONE);

                        glBegin(GL_QUADS);
                                glVertex3f(-10.0f, -10.0f, 15.1f);
                                glVertex3f(10.0f, -10.0f, 15.1f);
                                glVertex3f(10.0f, 10.0f, 15.1f);
                                glVertex3f(-10.0f, 10.0f, 15.1f);
                        glEnd();

                        glDrawBuffer(GL_BACK);
                }

                glColor3f(0.2f, 0.4f, 0.6f);
                auxSolidCube(30.0f);
        glPopMatrix();

        glFlush();
        SwapBuffers(g_HDC);                        // bring backbuffer to foreground
}

// function to set the pixel format for the device context
void SetupPixelFormat(HDC hDC)
{
        int nPixelFormat;                                        // our pixel format index

        static PIXELFORMATDESCRIPTOR pfd = {
                sizeof(PIXELFORMATDESCRIPTOR),        // size of structure
                1,                                                                // default version
                PFD_DRAW_TO_WINDOW |                        // window drawing support
                PFD_SUPPORT_OPENGL |                        // OpenGL support
                PFD_DOUBLEBUFFER,                                // double buffering support
                PFD_TYPE_RGBA,                                        // RGBA color mode
                32,                                                                // 32 bit color mode
                0, 0, 0, 0, 0, 0,                                // ignore color bits, non-palettized mode
                0,                                                                // no alpha buffer
                0,                                                                // ignore shift bit
                0,                                                                // no accumulation buffer
                0, 0, 0, 0,                                                // ignore accumulation bits
                16,                                                                // 16 bit z-buffer size
                0,                                                                // no stencil buffer
                0,                                                                // no auxiliary buffer
                PFD_MAIN_PLANE,                                        // main drawing plane
                0,                                                                // reserved
                0, 0, 0 };                                                // layer masks ignored

        nPixelFormat = ChoosePixelFormat(hDC, &pfd);        // choose best matching pixel format

        SetPixelFormat(hDC, nPixelFormat, &pfd);                // set pixel format to device context
}

// the Windows Procedure event handler
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        static HGLRC hRC;                                        // rendering context
        static HDC hDC;                                                // device context
        int width, height;                                        // window width and height

        switch(message)
        {
                case WM_CREATE:                                        // window is being created

                        hDC = GetDC(hwnd);                        // get current window's device context
                        g_HDC = hDC;
                        SetupPixelFormat(hDC);                // call our pixel format setup function

                        // create rendering context and make it current
                        hRC = wglCreateContext(hDC);
                        wglMakeCurrent(hDC, hRC);

                        return 0;
                        break;

                case WM_CLOSE:                                        // windows is closing

                        // deselect rendering context and delete it
                        wglMakeCurrent(hDC, NULL);
                        wglDeleteContext(hRC);

                        // send WM_QUIT to message queue
                        PostQuitMessage(0);

                        return 0;
                        break;

                case WM_SIZE:
                        height = HIWORD(lParam);                // retrieve width and height
                        width = LOWORD(lParam);

                        if (height==0)                                        // don't want a divide by zero
                        {
                                height=1;                                       
                        }

                        glViewport(0, 0, width, height);        // reset the viewport to new dimensions
                        glMatrixMode(GL_PROJECTION);                // set projection matrix current matrix
                        glLoadIdentity();                                        // reset projection matrix

                        // calculate aspect ratio of window
                        gluPerspective(54.0f,(GLfloat)width/(GLfloat)height,1.0f,1000.0f);

                        glMatrixMode(GL_MODELVIEW);                        // set modelview matrix
                        glLoadIdentity();                                        // reset modelview matrix

                        return 0;
                        break;

                case WM_KEYDOWN:                                        // is a key pressed?
                        keyPressed[wParam] = true;
                        return 0;
                        break;

                case WM_KEYUP:
                        keyPressed[wParam] = false;
                        return 0;
                        break;

                default:
                        break;
        }

        return (DefWindowProc(hwnd, message, wParam, lParam));
}

// the main windows entry point
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
        WNDCLASSEX windowClass;                // window class
        HWND           hwnd;                        // window handle
        MSG                   msg;                                // message
        bool           done;                        // flag saying when our app is complete
        DWORD           dwExStyle;                // Window Extended Style
        DWORD           dwStyle;                        // Window Style
        RECT           windowRect;

        // temp var's
        int width = 800;
        int height = 600;
        int bits = 32;

        //fullScreen = TRUE;

        windowRect.left=(long)0;                                                // Set Left Value To 0
        windowRect.right=(long)width;                                        // Set Right Value To Requested Width
        windowRect.top=(long)0;                                                        // Set Top Value To 0
        windowRect.bottom=(long)height;                                        // Set Bottom Value To Requested Height

        // fill out the window class structure
        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);        // default icon
        windowClass.hCursor                        = LoadCursor(NULL, IDC_ARROW);                // default arrow
        windowClass.hbrBackground        = NULL;                                                                // don't need background
        windowClass.lpszMenuName        = NULL;                                                                // no menu
        windowClass.lpszClassName        = "MyClass";
        windowClass.hIconSm                        = LoadIcon(NULL, IDI_WINLOGO);                // windows logo small icon

        // register the windows class
        if (!RegisterClassEx(&windowClass))
                return 0;

        if (fullScreen)                                                                // fullscreen?
        {
                DEVMODE dmScreenSettings;                                        // device mode
                memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
                dmScreenSettings.dmSize = sizeof(dmScreenSettings);       
                dmScreenSettings.dmPelsWidth = width;                // screen width
                dmScreenSettings.dmPelsHeight = height;                // screen height
                dmScreenSettings.dmBitsPerPel = bits;                // bits per pixel
                dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

                //
                if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
                {
                        // setting display mode failed, switch to windowed
                        MessageBox(NULL, "Display mode failed", NULL, MB_OK);
                        fullScreen=FALSE;       
                }
        }

        if (fullScreen)                                                                // Are We Still In Fullscreen Mode?
        {
                dwExStyle=WS_EX_APPWINDOW;                                // Window Extended Style
                dwStyle=WS_POPUP;                                                // Windows Style
                ShowCursor(FALSE);                                                // Hide Mouse Pointer
        }
        else
        {
                dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;        // Window Extended Style
                dwStyle=WS_OVERLAPPEDWINDOW;                                        // Windows Style
        }

        AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);                // Adjust Window To True Requested Size

        // class registered, so now create our window
        hwnd = CreateWindowEx(NULL,                                                                        // extended style
                                                  "MyClass",                                                        // class name
                                                  "Depth Buffer Example 2: Cutting Plane",                // app name
                                                  dwStyle | WS_CLIPCHILDREN |
                                                  WS_CLIPSIBLINGS,
                                                  0, 0,                                                                        // x,y coordinate
                                                  windowRect.right - windowRect.left,
                                                  windowRect.bottom - windowRect.top,        // width, height
                                                  NULL,                                                                        // handle to parent
                                                  NULL,                                                                        // handle to menu
                                                  hInstance,                                                        // application instance
                                                  NULL);                                                                // no extra params

        // check if window creation failed (hwnd would equal NULL)
        if (!hwnd)
                return 0;

        ShowWindow(hwnd, SW_SHOW);                        // display the window
        UpdateWindow(hwnd);                                        // update the window

        done = false;                                                // intialize the loop condition variable
        Initialize();                                                // initialize OpenGL

        // main message loop
        while (!done)
        {
                PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);

                if (msg.message == WM_QUIT)                // do we receive a WM_QUIT message?
                {
                        done = true;                                // if so, time to quit the application
                }
                else
                {
                        if (keyPressed[VK_ESCAPE])
                                done = true;
                        else
                        {
                                if (keyPressed[VK_SPACE])
                                        cuttingPlane = !cuttingPlane;

                                Render();

                                TranslateMessage(&msg);                // translate and dispatch to event queue
                                DispatchMessage(&msg);
                        }
                }
        }

        if (fullScreen)
        {
                ChangeDisplaySettings(NULL,0);                // If So Switch Back To The Desktop
                ShowCursor(TRUE);                                        // Show Mouse Pointer
        }

        return msg.wParam;
}

3

主题

121

帖子

121

积分

注册会员

Rank: 2

积分
121
QQ
发表于 2007-4-3 12:10:00 | 显示全部楼层

Re:关于深度缓存的问题?

程序空格键根本就没有打开或者关闭过深度测试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-4-13 00:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表