2016-11-10 85 views
0

我想在Windows上創建一個OpenGL應用程序。據我所知,我必須獲得的第一件事情之一是設備上下文,它必須傳遞給幾個選擇和設置像素格式並創建渲染上下文的函數。我使用the OpenGL wiki來了解我應該做什麼。 我的代碼是這樣的:OpenGL獲取設備上下文

#include <iostream> 
#include <windef.h> 
#include <wingdi.h> 

HDC hdc; 

int main() { 
    hdc = wglGetCurrentDC(); 
    std::cout << "HDC: " << hdc << std::endl; 
    return 0; 
} 

這將打印

HDC: 0 

我假定設備上下文指的是物理設備,但我讀的地方,它是指任何可繪製的「面」。在這兩種情況下是我的問題:我如何獲得一個非空DC?或者我應該執行一組完全不同的步驟來設置整個OpenGL系統?

我發現很多教程在線,但它們都使用GLUT,GLEW,GLFW,X11,SDL等,這些庫。圖書館使某些事情變得更容易,但他們通常不執行不使用它們的不可能完成的任務。這一次,我想嘗試以艱難的方式做事,因此不使用庫,只是簡單的OpenGL。

我發現,在去年,a tutorial只有使用Windows庫用於創建一個窗口。

+0

我也這麼認爲,但文章主要是關於創建一個OpenGL上下文,而我需要的上下文是一個設備上下文。文章指出:「你應該知道窗口句柄(HWND)和設備上下文(DC)是什麼,以及如何創建它們。」 –

+0

所以你的意思是代碼不適用於這種情況。我認爲你可能是對的,但這個問題成爲我必須創建一個問題。 –

+0

對不起,你是對的;因爲它是一個WGL函數,所以我把它誤認爲是'wglGetCurrentContext'。 –

回答

3

你不說出你的OS但我認爲Windows在功能名稱。問題正如Reto Koradi在評論中所述。要設置的OpenGL你需要這樣做:

  1. 獲取OS手柄,有效的設備上下文

    反對它可以是OS窗口或OS位圖。如果你只是控制檯應用程序,那麼你需要首先創建一個有效的窗口,然後使用它的句柄(我的知識控制檯沒有Canvas)。

    可以使用GLUT的窗口創建或者如果你的編譯IDE有一個窗口應用程序,你可以使用它。您還可以結合使用OpenGL和Window組件。 VCL也是沒有問題的(我用了多年與的OpenGL

    在你可以使用CreateWindowEx所以谷歌它的一個示例窗...

    反正你應該有你的手柄一個變量,如:

    HWND hwin=NULL; 
    

    如果您有與Windows應用程序的經驗,然後使用GLUT這一點。否則,您需要學習很多東西來涵蓋窗口創建,事件消息處理以及用戶/應用程序交互,這對於沒有嚮導的新手來說可能真是壓倒一切。對於

  2. 獲取設備上下文句柄

    HDC hdc = GetDC(hwin); 
    
  3. 設置像素格式,你需要設備上下文的

    PIXELFORMATDESCRIPTOR pfd; 
    ZeroMemory(&pfd, sizeof(pfd));  // set the pixel format for the DC 
    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 = 24; 
    pfd.iLayerType = PFD_MAIN_PLANE; 
    SetPixelFormat(hdc,ChoosePixelFormat(hdc, &pfd),&pfd); 
    
  4. 創建設備上下文的OpenGL渲染上下文

    HGLRC hrc = wglCreateContext(hdc); 
    
  5. 將它設置爲默認OpenGL上下文

    wglMakeCurrent(hdc, hrc); 
    

這是絕對最低,沒有任何錯誤檢查,額外的緩衝器等欲瞭解更多信息和實際的代碼中看到相關QA的:

您可以使用GLUT所有這一切。這是第一次打我發現通過快速搜索:

或者遵循的OpenGL教程有噸他們在那裏......

+0

對不起,我沒有提到我的操作系統。正如你已經猜到的那樣,它是窗戶。至於你所描述的步驟:我得到3,4和5,因爲它們在我使用的wiki文章中有相當清楚的描述。感謝您明確表示我首先必須創建一個窗口。關於使用GLUT ... GLUT是一個庫,這意味着也許還有一種方法來創建一個窗口而不使用它? CreateWindow或CreateWindowEx可能工作,所以我會嘗試。謝謝。 –