2014-06-29 32 views
0

我正在學習關於2D圖形的一些時間,我正在嘗試編寫一個簡單的程序來顯示像精靈一樣的位圖。我組合了幾個代碼來獲得這個。應用程序運行正常(我的意思是它沒有崩潰),我們可以看到一個窗口,但圖像沒有顯示。
下面是代碼:OpenGL - 一個簡單的程序

#include <stdio.h> 
#include <windows.h> 
#include <GL/gl.h> 
#include <GL/glext.h> 
#include <GL/glu.h> 

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); 
GLuint LoadBMP(const char *fileName); 

char szClassName[ ] = "CodeBlocksWindowsApp"; 

int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) 
{ 
    HWND hwnd; 
    MSG Msg; 
    WNDCLASSEX wincl = {sizeof (WNDCLASSEX), CS_DBLCLKS, WindowProcedure, 0, 0, hThisInstance, LoadIcon (NULL, IDI_APPLICATION), LoadCursor (NULL, IDC_ARROW), (HBRUSH) COLOR_BACKGROUND, NULL, szClassName, LoadIcon (NULL, IDI_APPLICATION)}; 
    if (!RegisterClassEx(&wincl)) 
     return 0; 
    hwnd = CreateWindowEx(0, szClassName, "Code::Blocks Template Windows App", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL); 
    ShowWindow (hwnd, nCmdShow); 
      GLuint texture = LoadBMP("image.bmp"); 
      glEnable(GL_TEXTURE_2D); 

      glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE); 
      glBindTexture(GL_TEXTURE_2D, texture); 
      glBegin(GL_QUADS); 
       glTexCoord2i(0, 0); glVertex2i(0, 0); 
       glTexCoord2i(0, 1); glVertex2i(0, 64); 
       glTexCoord2i(1, 1); glVertex2i(64, 64); 
       glTexCoord2i(1, 0); glVertex2i(64, 0); 
      glEnd(); 

      glDisable(GL_TEXTURE_2D); 
    while (GetMessage (&Msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&Msg); 
     DispatchMessage(&Msg); 
    } 
    return Msg.wParam; 
} 

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message)     /* handle the Msg */ 
    { 
     case WM_DESTROY: 
      PostQuitMessage (0);  /* send a WM_QUIT to the message queue */ 
      break; 
     default:      /* for Msg that we don't deal with */ 
      return DefWindowProc (hwnd, message, wParam, lParam); 
    } 
    return 0; 
} 

GLuint LoadBMP(const char *fileName) 
{ 
    FILE *file; 
    unsigned char header[54]; 
    unsigned int dataPos; 
    unsigned int size; 
    unsigned int width, height; 
    unsigned char *data; 
    file = fopen(fileName, "rb"); 
    if (file == NULL) 
    { 
     MessageBox(NULL, "Error: Invaild file path!", "Error", MB_OK); 
     return false; 
    } 
    if (fread(header, 1, 54, file) != 54) 
    { 
     MessageBox(NULL, "Error: Invaild file!", "Error", MB_OK); 
     return false; 
    } 
    if (header[0] != 'B' || header[1] != 'M') 
    { 
     MessageBox(NULL, "Error: Invaild file!", "Error", MB_OK); 
     return false; 
    } 
    dataPos  = *(int*)&(header[0x0A]); 
    size  = *(int*)&(header[0x22]); 
    width  = *(int*)&(header[0x12]); 
    height  = *(int*)&(header[0x16]); 
    if (size == NULL) 
     size = width * height * 3; 
    if (dataPos == NULL) 
     dataPos = 54; 

    data = new unsigned char[size]; 

    fread(data, 1, size, file); 

    GLuint texture; 
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); 
    return texture; 
} 

請告訴我,我在做什麼錯?

+0

「應用程序運行正常(我的意思是它正在崩潰)」...所以它應該*會崩潰? – genpfault

+0

看看這裏http://stackoverflow.com/a/20679773/2521214我的簡單OpenGL應用程序borland ...只需複製intit /退出代碼並更改Form1-> Handle來處理你想要OpenGL的窗口。 App/Windw事件名稱很簡單,所以不應該有任何問題... – Spektre

回答

1

您確實創建了一個窗口,但未創建OpenGL context。 如果沒有GL上下文,則不能使用GL。在Windows上,創建GL上下文的本地API是wgl。這個OpeGL.org wiki article解釋了一些使用wgl的細節。

但是,您可能希望使用一些GL上下文和窗口管理庫,它以獨立於平臺的方式提取整個過程,以便通過少量調用即可創建具有GL功能的窗口。看看GLFW。這wiki article列出了更多這樣的庫。