2014-02-25 56 views
0

我想從數組中加載紋理。我有一個應該用於紋理的四邊形。紋理不能使用OpenGL

#include <Windows.h> 
#include <gl\GL.h> 
#include <gl\GLU.h> 
#include <fstream> 
#include <vector> 
#include <string> 
WNDCLASSEX wclass; 
    MSG msg; 
    HWND hwnd; 
    HDC hdc; 
    float angle; 
    HGLRC hrc; 
    unsigned int tex; 
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); 
void EnableOpenGL(HWND hwnd, HDC* hDC, HGLRC* hRC); 
void resize() 
{ 
    RECT rec; 
    GetClientRect(hwnd, &rec); 
    float width = 400; 
    float height = 400; 
    GLfloat fieldOfView = 60.0f; 
    glViewport (0, 0, rec.right, rec.bottom); 

    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(fieldOfView, (GLfloat) width/(GLfloat) height, 0.1, 500.0); 


    glMatrixMode(GL_MODELVIEW); 
    glEnable(GL_TEXTURE_2D); 
    glLoadIdentity(); 
} 

void init() 
{ 
    GLubyte pixels[12] = { 
     0, 0, 0, 1, 1, 1, 
     1, 1, 1, 0, 0, 0 
    }; 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,2,2, 0, GL_RGB, GL_UNSIGNED_BYTE,pixels);   
} 

void draw() 
{ 
    angle -= 0.01f; 
    float rtri = 0; 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glTranslatef(0, 0, -5); 
    glRotatef(angle,0, 1, 0); 
    glBindTexture(GL_TEXTURE_2D, tex); 

    glBegin(GL_QUADS); 
     glColor3f(0,1,0); 
     glTexCoord2f(0.0, 0.0); 
     glVertex3f(0.0, 0.0, 0.0); 
     glTexCoord2f(1.0, 0.0); 
     glVertex3f(1.0, 0.0, 0.0); 
     glTexCoord2f(1.0, 1.0); 
     glVertex3f(1.0, 1.0, 0.0); 
     glTexCoord2f(0.0, 1.0); 
     glVertex3f(0.0, 1.0, 0.0); 
    glEnd(); 
    glDisable(GL_TEXTURE_2D); 

    SwapBuffers(hdc); 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpstr, int nCmdShow) 
{ 

    wclass.cbSize = sizeof(WNDCLASSEX); 
    wclass.style = 0; 
    wclass.lpfnWndProc = WinProc; 
    wclass.cbClsExtra = 0; 
    wclass.cbWndExtra = 0; 
    wclass.hInstance = hInstance; 
    wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wclass.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wclass.hbrBackground = (HBRUSH) (COLOR_WINDOW); 
    wclass.lpszMenuName = NULL; 
    wclass.lpszClassName = "CLASS"; 
    wclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 

    if(!RegisterClassEx(&wclass)) 
    { 
     MessageBox(0, "Windows Class Registration Failure Detected!\nProgram Can't Be Initialized..", "Failure Detected", MB_ICONERROR | MB_OK); 
     return 0; 
    } 

    hwnd = CreateWindowEx(
    0, "CLASS", "dddd", WS_OVERLAPPEDWINDOW, 
    0, 0, 700, 700, 
    HWND_DESKTOP, NULL, hInstance, NULL 
    ); 

    hdc = GetDC(hwnd); 
    EnableOpenGL(hwnd, &hdc, &hrc); 
    ShowWindow(hwnd, nCmdShow); 
    UpdateWindow(hwnd); 
    if(hwnd == NULL) 
    { 
     MessageBox(0, "Windows Form Creation Failure..", "Failure", MB_ICONERROR | MB_OK); 
    } 
    while(GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return msg.wParam; 
} 
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
    { 
    case WM_CREATE: 
     init(); 
     break; 
     case WM_DESTROY: 
      PostQuitMessage (0); 
      break; 
     case WM_TIMER: 
      switch(wParam) 
      { 
      //case UPDATER_ID: 
       //update(); 
       //break; 
      } 
      break; 
     case WM_PAINT: 
      draw(); 
      break; 
     case WM_SIZE: 
      resize(); 
      break; 
     default: 
       return DefWindowProc (hwnd, msg, wParam, lParam); 
    } 

    return 0; 
} 

void EnableOpenGL(HWND hwnd, HDC* hDC, HGLRC* hRC) 
{ 
    PIXELFORMATDESCRIPTOR pfd; 

    int iFormat; 

    *hDC = GetDC(hwnd); 

    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 = 16; 
    pfd.iLayerType = PFD_MAIN_PLANE; 

    iFormat = ChoosePixelFormat(*hDC, &pfd); 

    SetPixelFormat(*hDC, iFormat, &pfd); 

    *hRC = wglCreateContext(*hDC); 

    wglMakeCurrent(*hDC, *hRC); 
} 

它沒有畫出紋理。一切似乎都很好,除非它不在數組中繪製紋理。

此外,當致電glGetError()我得到1282結果。

我想避免使用SOIL或SDL等外部庫。使用着色器也不是一個選項。

+0

@wendelbsilva儘管如此,仍然無法正常工作。我編輯了問題中的代碼。 – magnavimaras

+3

這段代碼中的任何地方都沒有一次調用'glGetError(...)',因此無法知道可能導致它的原因。我建議你在各個地方插入對'glGetError(...)'的調用來嘗試本地化源代碼。另外,由於所有GL錯誤代碼都是以十六進制定義的,所以** 1282 **不是特別有用。如果你將它轉換爲** 0x0502 **,你可以很快發現它是'GL_INVALID_OPERATION'。 –

+0

我想你錯過了調用['glActiveTexture'](http://www.opengl.org/sdk/docs/man/docbook4/xhtml/glActiveTexture.xml) – Borgleader

回答

1

您在init()中沒有當前GL上下文,您在WinProc()中調用它。將init()電話撥入EnableOpenGL()WinMain()


另外:

GLubyte pixels[12] = 
{ 
    0, 0, 0, 1, 1, 1, 
    1, 1, 1, 0, 0, 0 
}; 

GLubyte通道範圍從0(最小強度)到255(最大強度)。

你有一個純黑色和非常接近純黑色的棋盤圖案。

試試這個:

GLubyte pixels[12] = 
{ 
     0, 0, 0, 255, 255, 255, 
    255, 255, 255,  0, 0, 0, 
}; 

由於您使用的RGB你應該也是你的glTexImage2D()調用之前發出glPixelStorei(GL_UNPACK_ALIGNMENT, 1)(默認4)。


另外:

你需要真正渲染你的四之前啓用使用glEnable(GL_TEXTURE_2D)紋理。


與所有的修正:

#include <Windows.h> 
#include <gl\GL.h> 
#include <gl\GLU.h> 
#include <fstream> 
#include <vector> 
#include <string> 

WNDCLASSEX wclass; 
MSG msg; 
HWND hwnd; 
HDC hdc; 
float angle; 
HGLRC hrc; 
unsigned int tex; 

void init() 
{ 
    GLubyte pixels[] = 
    { 
     0, 0, 0, 255, 255, 255, 
     255, 255, 255, 0, 0, 0, 
    }; 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,2,2, 0, GL_RGB, GL_UNSIGNED_BYTE,pixels);   
} 

void draw() 
{ 
    angle -= 0.01f; 
    float rtri = 0; 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glClearColor(0.5, 0.5, 0.5, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glTranslatef(0, 0, -5); 
    glRotatef(angle,0, 1, 0); 

    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, tex); 

    glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 0.0); 
    glVertex3f(0.0, 0.0, 0.0); 
    glTexCoord2f(1.0, 0.0); 
    glVertex3f(1.0, 0.0, 0.0); 
    glTexCoord2f(1.0, 1.0); 
    glVertex3f(1.0, 1.0, 0.0); 
    glTexCoord2f(0.0, 1.0); 
    glVertex3f(0.0, 1.0, 0.0); 
    glEnd(); 

    glDisable(GL_TEXTURE_2D); 

    SwapBuffers(hdc); 
} 

void resize() 
{ 
    RECT rec; 
    GetClientRect(hwnd, &rec); 
    float width = 400; 
    float height = 400; 
    GLfloat fieldOfView = 60.0f; 
    glViewport (0, 0, rec.right, rec.bottom); 

    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(fieldOfView, (GLfloat) width/(GLfloat) height, 0.1, 500.0); 

    glMatrixMode(GL_MODELVIEW); 
    glEnable(GL_TEXTURE_2D); 
    glLoadIdentity(); 
} 

LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
    { 
    case WM_CREATE: 
     break; 
    case WM_DESTROY: 
     PostQuitMessage (0); 
     break; 
    case WM_TIMER: 
     break; 
    case WM_PAINT: 
     draw(); 
     break; 
    case WM_SIZE: 
     resize(); 
     break; 
    default: 
     return DefWindowProc (hwnd, msg, wParam, lParam); 
    } 

    return 0; 
} 

void EnableOpenGL(HWND hwnd, HDC* hDC, HGLRC* hRC) 
{ 
    PIXELFORMATDESCRIPTOR pfd; 

    int iFormat; 

    *hDC = GetDC(hwnd); 

    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 = 16; 
    pfd.iLayerType = PFD_MAIN_PLANE; 

    iFormat = ChoosePixelFormat(*hDC, &pfd); 

    SetPixelFormat(*hDC, iFormat, &pfd); 

    *hRC = wglCreateContext(*hDC); 

    wglMakeCurrent(*hDC, *hRC); 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpstr, int nCmdShow) 
{ 
    wclass.cbSize = sizeof(WNDCLASSEX); 
    wclass.style = 0; 
    wclass.lpfnWndProc = WinProc; 
    wclass.cbClsExtra = 0; 
    wclass.cbWndExtra = 0; 
    wclass.hInstance = hInstance; 
    wclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wclass.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wclass.hbrBackground = (HBRUSH) (COLOR_WINDOW); 
    wclass.lpszMenuName = NULL; 
    wclass.lpszClassName = "CLASS"; 
    wclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 

    if(!RegisterClassEx(&wclass)) 
    { 
     MessageBox(0, "Windows Class Registration Failure Detected!\nProgram Can't Be Initialized..", "Failure Detected", MB_ICONERROR | MB_OK); 
     return 0; 
    } 

    hwnd = CreateWindowEx 
     (
     0, "CLASS", "dddd", WS_OVERLAPPEDWINDOW, 
     0, 0, 700, 700, 
     HWND_DESKTOP, NULL, hInstance, NULL 
     ); 

    hdc = GetDC(hwnd); 
    EnableOpenGL(hwnd, &hdc, &hrc); 
    init(); 

    ShowWindow(hwnd, nCmdShow); 
    UpdateWindow(hwnd); 
    if(hwnd == NULL) 
    { 
     MessageBox(0, "Windows Form Creation Failure..", "Failure", MB_ICONERROR | MB_OK); 
    } 
    while(GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return msg.wParam; 
} 
+0

謝謝。謝謝。謝謝。如果我有足夠的積分來回答我的問題,我會盡可能快地做到。我太高興了。有用!! – magnavimaras

2

在你的畫給你打電話有:

glDisable(GL_TEXTURE_2D); 

但在繪製調用你有沒有相應的glEnable。如果窗口渲染多次,後續幀將禁用紋理。