简体   繁体   中英

Textures not working with OpenGL

I am trying to load a texture from an array. I have a quad that is supposed to be used for the texture.

#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);
}

It is not drawing the texture. Everything seems fine except the fact that it doesn't draw the texture in the array.

Also, when calling glGetError() I get 1282 as result.

I would like to avoid using external libraries such as SOIL or SDL. Using shaders is also not an option.

In your draw call you have:

glDisable(GL_TEXTURE_2D);

But you have no corresponding glEnable in the draw call. If you window renders more than once, subsequent frames will have texturing disabled.

You don't have a current GL context in init() where you're calling it in WinProc() . Move the init() call to after EnableOpenGL() in WinMain() .


Also:

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

GLubyte channels range from 0 (minimum intensity) to 255 (maximum intensity).

You have a checkerboard pattern of pure black and very near pure black.

Try this:

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

You should also issue a glPixelStorei(GL_UNPACK_ALIGNMENT, 1) (default 4 ) before your glTexImage2D() call since you're using RGB.


Also:

You need to actually enable texturing using glEnable( GL_TEXTURE_2D ) before rendering your quad.


With all the fixes:

#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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM