2014-02-25 58 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。如果窗口渲染多次,后续帧将禁用纹理。