Textures not working with OpenGL

前端 未结 2 345
一向
一向 2021-01-26 03:58

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

#include 
#include 
#inc         


        
2条回答
  •  梦毁少年i
    2021-01-26 04:50

    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 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    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", "ffffdd", 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;
    }
    

提交回复
热议问题