【问题标题】:I can't render a cube in OpenGL, in Windows, using MinGW我无法使用 MinGW 在 Windows 中的 OpenGL 中渲染立方体
【发布时间】:2014-08-14 14:03:37
【问题描述】:

我尝试在 Windows 中使用 OpenGL 渲染立方体。但是显示窗口是黑色的。我启用了 Z-Buffer,我在 glClear 函数中清除了深度位,等等。但没有运气。问题是我遵循的每个示例或文档都不完整,或者遗漏了一些信息,我现在非常非常困惑。我不知道我做对了什么,做错了什么。

我只想显示一个立方体,以知道渲染器已准备好处理 3D 图形(我可以毫无问题地显示 2D 图形)。没有别的了。

这是我的主程序的代码:

    #include "demo.h"
#include "renderfunc.c"

HDC hDC;
HGLRC hRC;

void enableGL(HWND hWnd)
{

    hDC = GetDC(hWnd);

    int nPixelFormat;
    static PIXELFORMATDESCRIPTOR pfd = {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW |
        PFD_SUPPORT_OPENGL |
        PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA,
        24,
        0,0,0,0,0,0,
        0,0,
        0,0,0,0,0,
        32,
        0,
        0,
        PFD_MAIN_PLANE,
        0,
        0,0,0 };

        if(!hDC)
        {
        MessageBox(hWnd,L"Can't Create A GL Device Context.",L"ERROR",MB_OK|MB_ICONEXCLAMATION);
        return;
        }

        nPixelFormat = ChoosePixelFormat(hDC, &pfd);
        if(!nPixelFormat)
        {
        MessageBox(hWnd,L"Can't find a proper Pixel Format.",L"ERROR",MB_OK|MB_ICONEXCLAMATION);
        return;
        }

        SetPixelFormat(hDC, nPixelFormat, &pfd);

        /* Those lines has to be here*/
        hRC = wglCreateContext(hDC);
        wglMakeCurrent(hDC,hRC);

        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

        /* UNCOMMENT THIS SECTION FOR 3D */

            glClearDepth(1.0f);
            glEnable(GL_DEPTH_TEST);
            glDepthFunc(GL_EQUAL); //In some examples this is GL_LESS
            glDepthMask(GL_TRUE);
            glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //Accurate perspective calculations

        return;
}

GLvoid ChangeSize(GLsizei width, GLsizei height)
{
    if(height==0)
        height=1;

    glViewport(0,0,width,height);
    //glLoadIdentity();

    /* THIS SECTION IS FOR 3D GRAPHICS */
    /* Comment glLoadIdentity above, and uncomment this section */
    /* If you enable Z-buffer */

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(45.0f, (GLfloat)width/(GLfloat)height,0.1f,100.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    return;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_CREATE:
        enableGL(hWnd);
        return 0;

        case WM_CLOSE:
        PostQuitMessage(0);
        return 0;

        case WM_DESTROY:
        ReleaseDC(hWnd,hDC);
        wglMakeCurrent(hDC, NULL);
        wglDeleteContext(hRC);
        PostQuitMessage(0);
        return 0;

        case WM_KEYDOWN:
            switch(wParam)
            {
                case VK_ESCAPE:
                PostQuitMessage(0);
                return 0;
            }
        return 0;

        case WM_PAINT:
        glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        /* GL ANIMATION GOES HERE */
        //Change this for whatever you want to render
        renderCubeTest();
        /* -------------------- */
        SwapBuffers(hDC);
        ValidateRect(hWnd, NULL);

        return 0;

        case WM_SIZE:
            ChangeSize(LOWORD(lParam), HIWORD(lParam));
        return 0;

        default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
    WNDCLASS wc;
    HWND hWnd;
    MSG msg;
    //String with the name of the class of our window
    LPCTSTR classname = L"OpenGL";
    //String with the title of our window
    LPCTSTR windowtitle = L"Cubes Demo By Ninjihaku Software";
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpfnWndProc = (WNDPROC) WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    //wc.hIcon = (HICON) LoadImage(hInstance, MAKEINTRESOURCE(IDI_APPICON), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_DEFAULTCOLOR | LR_SHARED);
    wc.hIcon = NULL;
    wc.hCursor = (HCURSOR) LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED);
    wc.hbrBackground = NULL;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = classname;

    if(RegisterClass(&wc) == 0)
        return false;

    //hWnd = CreateWindow(classname, windowtitle, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 100, 100, 640, 480, NULL, NULL, hInstance, NULL);
    hWnd = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, classname, windowtitle,  WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 640, 480, NULL, NULL, hInstance, NULL);

    if(hWnd == NULL)
        return FALSE;

    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);

    while(GetMessage(&msg, NULL, 0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);  
    }

    DestroyWindow(hWnd);

    return (int) msg.wParam;
}

然后是renderfunc.c中包含的renderCubeTest()函数:

void renderCubeTest()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glPushMatrix();
    glTranslatef(1.5f, 0.0f, -7.0f);  // Move right and into the screen

    glBegin(GL_QUADS);                // Begin drawing the color cube with 6 quads
      // Top face (y = 1.0f)
      // Define vertices in counter-clockwise (CCW) order with normal pointing out
      glColor3f(0.0f, 1.0f, 0.0f);     // Green
      glVertex3f( 1.0f, 1.0f, -1.0f);
      glVertex3f(-1.0f, 1.0f, -1.0f);
      glVertex3f(-1.0f, 1.0f,  1.0f);
      glVertex3f( 1.0f, 1.0f,  1.0f);

      // Bottom face (y = -1.0f)
      glColor3f(1.0f, 0.5f, 0.0f);     // Orange
      glVertex3f( 1.0f, -1.0f,  1.0f);
      glVertex3f(-1.0f, -1.0f,  1.0f);
      glVertex3f(-1.0f, -1.0f, -1.0f);
      glVertex3f( 1.0f, -1.0f, -1.0f);

      // Front face  (z = 1.0f)
      glColor3f(1.0f, 0.0f, 0.0f);     // Red
      glVertex3f( 1.0f,  1.0f, 1.0f);
      glVertex3f(-1.0f,  1.0f, 1.0f);
      glVertex3f(-1.0f, -1.0f, 1.0f);
      glVertex3f( 1.0f, -1.0f, 1.0f);

      // Back face (z = -1.0f)
      glColor3f(1.0f, 1.0f, 0.0f);     // Yellow
      glVertex3f( 1.0f, -1.0f, -1.0f);
      glVertex3f(-1.0f, -1.0f, -1.0f);
      glVertex3f(-1.0f,  1.0f, -1.0f);
      glVertex3f( 1.0f,  1.0f, -1.0f);

      // Left face (x = -1.0f)
      glColor3f(0.0f, 0.0f, 1.0f);     // Blue
      glVertex3f(-1.0f,  1.0f,  1.0f);
      glVertex3f(-1.0f,  1.0f, -1.0f);
      glVertex3f(-1.0f, -1.0f, -1.0f);
      glVertex3f(-1.0f, -1.0f,  1.0f);

      // Right face (x = 1.0f)
      glColor3f(1.0f, 0.0f, 1.0f);     // Magenta
      glVertex3f(1.0f,  1.0f, -1.0f);
      glVertex3f(1.0f,  1.0f,  1.0f);
      glVertex3f(1.0f, -1.0f,  1.0f);
      glVertex3f(1.0f, -1.0f, -1.0f);
   glEnd();  // End of drawing color-cube
   glFlush();
   glPopMatrix();
    return;
}

我希望有人可以帮助我并告诉我这有什么问题。

【问题讨论】:

    标签: c opengl gcc


    【解决方案1】:
    glDepthFunc(GL_EQUAL);
    

    我怀疑这就是问题所在——它的基本作用是告诉 OpenGL 只有在新像素的深度值等于当前像素的深度值时才应将像素渲染到屏幕上。这肯定不是你想要的。

    您应该使用GL_LEQUAL(注意“EQUAL”之前的“L”)或GL_LESS,因为这些是正常的比较函数。

    【讨论】:

    • 是的。将其更改为 LEQUAL 后,立方体出现了。非常感谢您对此函数的解释,尽管在许多示例中将其视为 GL_LESS,但我没有考虑更改此函数。
    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 2018-09-27
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多