-1

我正在尝试学习 OpenGL,但我还没有掌握它的窍门,因为我在第一个障碍中遇到了一个问题,我尝试显示一个鲜红色的正方形,但图像显示为栗色正方形。(我很抱歉,但由于没有足够的声誉,我无法发布图片:()

我一直在使用 SOIL 库 ( http://www.lonesock.net/soil.html ) 来简化加载纹理的任务,我很确定这就是问题所在。

我知道最明显的答案是不使用 SOIL,并且在尝试使用扩展之前先学习原始 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 内容,我可能听起来很愚蠢,但你必须从某个地方开始,对吗?:P

/** 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
4

1 回答 1

0

放在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 更简单、更便携。

于 2014-09-22T15:13:25.467 回答