我正在学习如何使用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对象。不确定,我会玩弄它并阅读它以了解它。谢谢!
[SOVLED]
仅对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();
答案 0 :(得分: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
。