C++ SDL OpenGL渲染问题

C++ SDL OpenGL渲染问题,c++,opengl,sdl,render,textures,C++,Opengl,Sdl,Render,Textures,我正在学习如何使用SDL和openGL。我已经在SDLTutorials.com上看过了教程。我现在正试图做得更进一步,为应用程序创建一个加载屏幕;一个面向对象的菜单系统 我开始做一些简单的测试。我已经通过纹理类完成了窗口的主背景。此处定义了两个相关功能: void Texture::Bind() { glBindTexture(GL_TEXTURE_2D, TextureID); } void Texture::RenderQuad(int X, int Y, int Width, i

我正在学习如何使用SDL和openGL。我已经在SDLTutorials.com上看过了教程。我现在正试图做得更进一步,为应用程序创建一个加载屏幕;一个面向对象的菜单系统

我开始做一些简单的测试。我已经通过纹理类完成了窗口的主背景。此处定义了两个相关功能:

void Texture::Bind() {
   glBindTexture(GL_TEXTURE_2D, TextureID);
}

void Texture::RenderQuad(int X, int Y, int Width, int Height) {
Bind();

    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(X, Y, 0);
        glTexCoord2f(1, 0); glVertex3f(X + Width, Y, 0);
        glTexCoord2f(1, 1); glVertex3f(X + Width, Y + Height, 0);
        glTexCoord2f(0, 1); glVertex3f(X, Y + Height, 0);
    glEnd();
}
我还创建了一个菜单类,它基本上是在系统中创建的任何菜单的父类,要开发的类类似于单击按钮或编辑框。到目前为止,类菜单中唯一相关的功能是:

void Menu::OnRender() {
    if( Visible ) {
        if(MenuTexture == NULL) {
            glColor4f(1.,G,B,A);
            glBegin(GL_QUADS);
                glVertex2d(X, Y);
                glVertex2d(X+Width,Y);
                glVertex2d(X+Width,Y+Height);
                glVertex2d(X,Y+Height);
            glEnd();
        }else{
            MenuTexture->RenderQuad(X,Y,Width,Height);
        }
    }
}
最后,我的应用程序创建了一个绑定到整个窗口的纹理。i、 e.回击

void App::OnRender() {


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();


    MainScreen.RenderQuad(0,0,winWidth,winHeight); //Texture Object with bkg.jpg
    MainMenu.OnRender();  //Menu object to be 150x300 and all black


    SDL_GL_SwapBuffers();
}
然后我创建一个菜单项,并尝试在背景上绘制它。如果我将初始化的颜色保留为黑色,整个屏幕几乎会立即变黑:我有一个帧,可能是绘制菜单的第一个周期,黑色正方形放在窗口上,然后它变黑。。如果我用1.0表示红色,那么整个图片就像放置了某种红色滤镜,菜单框绘制了一个不透明的红色正方形

我已经通过了几个例子,如何渲染,但我必须错过一些东西。本质上,如果我们把它全部放在所做的事情上,我将纹理绑定到一个曲面,定义曲面和纹理绑定的坐标。然后我渲染一个四边形。我已将颜色调用放在glBegin()内的菜单中,定义了所有4个顶点的颜色

感谢我选择的答案:这解决了问题。然而,直到我将菜单对象返回到调制状态,它才用正确的颜色呈现菜单对象。不确定,我会玩它,并阅读了这个了解它。谢谢大家!

[已解决] 仅对
App::OnRender()
进行了更改:

默认值为
GL\u MODULATE
,它将传入的纹理值乘以当前颜色

如果当前颜色为黑色(
RGB(0,0,0)
),则会将所有纹理渲染为黑色。单通道颜色相同:
RGB(1,0,0)*RGB(x,y,z)==RGB(x,0,0)

尝试使用
GL\u贴花

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
MainScreen.RenderQuad(0,0,winWidth,winHeight);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
MainMenu.OnRender();