C++ OpenGL (с надстройкой SOIL) - Текстура выходит заштрихованной

Я пытаюсь изучить OpenGL, но я еще не освоил его, так как я столкнулся с проблемой при первом препятствии, когда я пытаюсь отобразить ярко-красный квадрат, но изображение получается в виде цвета бордового квадрата. (Я извиняюсь, но я не могу опубликовать фотографии из-за нехватки репутации:()

Я использовал библиотеку SOIL ( http://www.lonesock.net/soil.html), чтобы упростить задачу загрузки текстур, и я вполне уверен, что именно в этом проблема.

Я понимаю, что наиболее очевидный ответ - не использовать SOIL, а сначала изучить raw OGL, прежде чем пытаться использовать расширения, и я намерен это сделать. Однако я все еще хотел бы, чтобы это решение проблемы для душевного спокойствия.

Мое личное предположение состоит в том, что я, вероятно, включил какое-то затенение где-то, или есть какая-то особенность OGL или SOIL, которая заставляет менять оттенок текстуры, однако я не достаточно опытен, чтобы решить эту проблему.

Ниже приводится то, что я считаю соответствующим кодом.

void displayBackground()
{
    GetTexture("resources/red.png");
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex2f(0, 0);
        glTexCoord2f(480, 0); glVertex2f( 480, 0);
        glTexCoord2f(480, 480); glVertex2f( 480,  480);
        glTexCoord2f(0, 480); glVertex2f(0,  480);
    glEnd();
    glDisable(GL_TEXTURE_2D);
}

А ниже приведен SOIL-специфичный код, который, насколько я могу судить, должен загружать сплошную красную текстуру в активную текстуру OGL.

GLuint GetTexture(std::string Filename)
{
    GLuint tex_ID;

    tex_ID = SOIL_load_OGL_texture(
                Filename.c_str(),
                SOIL_LOAD_AUTO,
                SOIL_CREATE_NEW_ID,
                SOIL_FLAG_POWER_OF_TWO
                | SOIL_FLAG_MIPMAPS
                | SOIL_FLAG_COMPRESS_TO_DXT
                | SOIL_FLAG_DDS_LOAD_DIRECT
                );

        if( tex_ID > 0 )
        {
            glEnable( GL_TEXTURE_2D );
            glBindTexture( GL_TEXTURE_2D, tex_ID );

            return tex_ID;
        }
        else
            return 0;
}

Заранее благодарю за понимание того, где я, возможно, ошибся.

@ Nazar554 Полагаю, это то, что вы имеете в виду под портом просмотра? Извините, я знаю, что это очень простые вещи OGL, и я, вероятно, звучу довольно глупо, но вы должны начать где-нибудь правильно?:П

/** OpenGL Initial Setup**/
    //pixel format descriptor to describe pixel layout of a given surface
    PIXELFORMATDESCRIPTOR pfd;
    std::memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
    pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW |
                PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER_DONTCARE;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 32;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;

    HDC hdc = GetDC(hwnd); //gets device context of hwnd. Device context is a set of graphics objects that define how to draw to the given device
    int format = ChoosePixelFormat(hdc, &pfd); //chooses best pixel format for device context given the pfd to be used
    SetPixelFormat(hdc, format, &pfd);
    HGLRC hglrc;
    hglrc = wglCreateContext(hdc); //creates OGL rendering context suitable for drawing on the device specified by hdc
    wglMakeCurrent(hdc, hglrc); //makes hglrc the thread's current context. subsequent OGL calls made on hdc

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  // Red, Green, Blue, Alpha. (Additive color) Does not need to be updated every cycle
    glOrtho(0, 900, 600, 1.0, -1.0, 1.0); //sets co-ordinates system

1 ответ

Положил glOrtho до glClearColor, Также вам нужно выбрать проекционную матрицу перед звонком glOrtho, Использовать этот:

glMatrixMode(GL_PROJECTION); // select projection matrix
glLoadIdentity(); // clear it
glOrtho(0, w, h, 0, 0, 1); // compute projection matrix, and multiply identity matrix by it
// w, h is your window size if you are doing 2D
glMatrixMode(GL_MODELVIEW); // select model matrix

Также, если вы изучаете OpenGL, лучше начать с современных версий (3.3+ или 2.1 без старых вещей), а не 1.2. У них много различий, и будет сложно забыть все, что вы изучали раньше. Для новичков FreeGlut или GLFW является более простым и портативным, чем чистый Win32.

Другие вопросы по тегам