之前对GL.Color3的调用正在使我的纹理使用错误的颜色

时间:2011-04-09 19:52:45

标签: opengl opentk

制作2D OpenGL游戏。渲染帧时,我需要首先绘制一些计算的四边形几何体,然后绘制一些纹理的精灵。当我的渲染方法的主体只绘制精灵时,一切正常。但是,当我尝试在精灵之前绘制几何四边形时,精灵的纹理会变为先前使用的最后一个GL.Color3的颜色。我如何告诉OpenGL(好吧,OpenTK)“好的,我们已经完成绘制几何图形和时间来转向精灵了吗?”

这是渲染代码的样子:

        // Let's do some geometry 
        GL.Begin(BeginMode.Quads);
        GL.Color3(_dashboardBGColor);  // commenting this out makes my sprites look right

        int shakeBuffer = 100;
        GL.Vertex2(0 - shakeBuffer, _view.DashboardHeightPixels);
        GL.Vertex2(_view.WidthPixelsCount + shakeBuffer, _view.DashboardHeightPixels);
        GL.Vertex2(_view.WidthPixelsCount + shakeBuffer, 0 - shakeBuffer);
        GL.Vertex2(0 - shakeBuffer, 0 - shakeBuffer);

        GL.End();

        // lets do some sprites
        GL.Begin(BeginMode.Quads);
        GL.BindTexture(TextureTarget.Texture2D, _rockTextureId);

        float baseX = 200;
        float baseY = 200;

        GL.TexCoord2(0, 0); GL.Vertex2(baseX, baseY);
        GL.TexCoord2(1, 0); GL.Vertex2(baseX + _rockTextureWidth, baseY);
        GL.TexCoord2(1, 1); GL.Vertex2(baseX + _rockTextureWidth, baseY - _rockTextureHeight);
        GL.TexCoord2(0, 1); GL.Vertex2(baseX, baseY - _rockTextureHeight);  

        GL.End();

        GL.Flush();
        SwapBuffers();

1 个答案:

答案 0 :(得分:3)

默认纹理环境模式是GL_MODULATE,它会将纹理颜色与顶点颜色相乘。

一个简单的解决方案是在使用:

绘制纹理基元之前设置顶点颜色为1,1,1,1

glColor4f(1.0f,1.0f,1.0f,1.0f);

另一个解决方案是将纹理环境模式更改为GL_REPLACE,这会使纹理颜色替换顶点颜色并且没有问题:

glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);