我无法使用MinGW在Windows中使用OpenGL渲染多维数据集

时间:2014-08-14 14:03:37

标签: c opengl gcc

我尝试在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;
}

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

1 个答案:

答案 0 :(得分:5)

glDepthFunc(GL_EQUAL);

我怀疑这是问题 - 它基本上是告诉OpenGL,如果新像素的深度值等于当前像素的深度值,则只应将像素渲染到屏幕。这肯定不是你想要的。

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