SDL OpenGL渲染问题

SDL OpenGL Rendering Issue

本文关键字:问题 OpenGL SDL      更新时间:2023-10-16

我只是学习如何使用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();
}

我还创建了一个菜单类,它基本上是系统中创建的任何菜单的父类,要开发的类就像单击按钮或编辑框。到目前为止,类Menu中唯一相关的函数是:

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

最后,我的应用程序创建了一个纹理,它绑定到整个窗口。也就是背景。

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():

所做的更改
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();

GL_TEXTURE_ENV_MODE默认为GL_MODULATE,将传入的文本值乘以当前颜色。

如果当前颜色是黑色(RGB(0,0,0)),那么这将渲染你所有的纹理黑色。单通道颜色相同:RGB(1,0,0) * RGB(x,y,z) == RGB(x,0,0) .

尝试使用GL_DECAL