【问题标题】:SDL OpenGL Rendering IssueSDL OpenGL 渲染问题
【发布时间】:2013-06-06 05:50:34
【问题描述】:

我只是在学习如何使用 SDL 和 openGL。我已经阅读了 SDLTutorials.com 上的教程。我现在正试图更进一步,为应用程序创建一个加载屏幕; oop 菜单系统。

我开始非常简单地进行测试。我通过纹理类完成了窗口的主要背景。这里定义了两个相关函数:

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 个顶点的颜色。

感谢我选择的答案:这解决了问题。但是,在我返回它进行调制之前,它没有用正确的颜色渲染 Menu 对象。不确定,我会玩弄它并阅读它以了解它。谢谢!

[解决] 仅对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();

【问题讨论】:

    标签: c++ opengl sdl render textures


    【解决方案1】:

    GL_TEXTURE_ENV_MODE 默认为 GL_MODULATE,它将传入的纹素值乘以当前颜色。

    如果当前颜色是黑色 (RGB(0,0,0)),那么这会将所有纹理渲染为黑色。同样适用于单通道颜色:RGB(1,0,0) * RGB(x,y,z) == RGB(x,0,0)

    尝试使用GL_DECAL

    【讨论】:

      猜你喜欢
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      相关资源
      最近更新 更多