Why does my OpenGL Win32 app depth is limited and how to increase it?

63 Views Asked by At

My OpenGL scene 3D becomes all black when it outs of the "3D viewport deepth" but i don't succeded to increase the value of the "camera depth far value"

Here is my whole code if you want to C/C in code blocks

#include <windows.h>
#include <gl/gl.h>
#include <stdio.h>

LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
void EnableOpenGL(HWND hwnd, HDC*, HGLRC*);
void DisableOpenGL(HWND, HDC, HGLRC);

float relx = 0.0f;
float relz = 0.0f;

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_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,
                          1024,
                          768,
                          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 */
            glViewport(0,0,1280,720);
            glDepthRange(0,100000);
            glEnable(GL_DEPTH_TEST);
            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

            glPushMatrix();
            glRotatef(relx, 0,1,0);
            glRotatef(-10, 1,0,0);
            glTranslatef(-0.5, -0.75f, relz);

            glBegin(GL_QUADS);

                glColor3f(1.0f, 0.0f, 0.0f);   glVertex3f(0,0,0);
                glColor3f(1.0f, 0.0f, 0.0f);   glVertex3f(1,0,0);
                glColor3f(1.0f, 0.0f, 0.0f);   glVertex3f(1,1,0);
                glColor3f(1.0f, 0.0f, 0.0f);   glVertex3f(0,1,0);

            glEnd();

            glBegin(GL_QUADS);

                glColor3f(0.0f, 0.0f, 1.0f);   glVertex3f(0,0,1);
                glColor3f(0.0f, 0.0f, 1.0f);   glVertex3f(1,0,1);
                glColor3f(0.0f, 0.0f, 1.0f);   glVertex3f(1,1,1);
                glColor3f(0.0f, 0.0f, 1.0f);   glVertex3f(0,1,1);

            glEnd();

            glBegin(GL_QUADS);

                glColor3f(0.0f, 1.0f, 1.0f);   glVertex3f(0,1,0);
                glColor3f(0.0f, 1.0f, 1.0f);   glVertex3f(1,1,0);
                glColor3f(0.0f, 1.0f, 1.0f);   glVertex3f(1,1,1);
                glColor3f(0.0f, 1.0f, 1.0f);   glVertex3f(0,1,1);

            glEnd();

             glBegin(GL_QUADS);

                glColor3f(1.0f, 0.0f, 1.0f);   glVertex3f(0,0,0);
                glColor3f(1.0f, 0.0f, 1.0f);   glVertex3f(1,0,0);
                glColor3f(1.0f, 0.0f, 1.0f);   glVertex3f(1,0,1);
                glColor3f(1.0f, 0.0f, 1.0f);   glVertex3f(0,0,1);

            glEnd();

            glBegin(GL_QUADS);

                glColor3f(1.0f, 1.0f, 1.0f);   glVertex3f(0,0,0);
                glColor3f(1.0f, 1.0f, 1.0f);   glVertex3f(0,1,0);
                glColor3f(1.0f,1.0f, 1.0f);   glVertex3f(0,1,1);
                glColor3f(1.0f, 1.0f, 1.0f);   glVertex3f(0,0,1);

            glEnd();

             glBegin(GL_QUADS);

                glColor3f(1.0f, 1.0f, 0.0f);   glVertex3f(1,0,0);
                glColor3f(1.0f, 1.0f, 0.0f);   glVertex3f(1,1,0);
                glColor3f(1.0f, 1.0f, 0.0f);   glVertex3f(1,1,1);
                glColor3f(1.0f, 1.0f, 0.0f);   glVertex3f(1,0,1);

            glEnd();

            glPopMatrix();

            SwapBuffers(hDC);

            theta += 1.0f;
            Sleep (1);
        }
    }

    /* 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_LEFT:
                    relx += 1;
                break;
                case VK_RIGHT:
                    relx -= 1;
                break;
                case VK_UP:
                    relz += 0.1;
                break;
                case VK_DOWN:
                    relz -= 0.1;
                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 = 160000000;
    pfd.iLayerType = PFD_DIRECT3D_ACCELERATED;

    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);
}

I tried glDepthRange(0,100000); but unsuccessfull, my 3D cube became black if too far and I want to increase the value of "too far"

0

There are 0 best solutions below