0

编写一个简单的游戏来帮助学习 OpenGL。在当前版本中,我的渲染方法使用代码定义的颜色绘制一些几何四边形,然后渲染一些精灵。到目前为止,一切正常并按预期工作。我的精灵有作为背景的颜色 Auqua,我一直想设置为透明,但还没有。所以目前游戏看起来很正常,除了所有精灵都以蓝色为界。我正处于我希望蓝色消失而是透明的地步,所以我将 OnLoad 方法修改为:

...
Bitmap bitmap = new Bitmap("RockTexture.bmp"); // existing line
bitmap.MakeTransparent(Color.Aqua);  // new line
...  

然而,现在当我运行我的游戏时,所有的几何四边形都从屏幕上消失了!我的精灵确实保持并看起来适当透明。

我不确定为什么会这样。这是我的渲染方法:

    protected override void OnRenderFrame(FrameEventArgs e)
    {
        base.OnRenderFrame(e);

        GL.Clear(ClearBufferMask.ColorBufferBit);

        GL.Begin(BeginMode.Quads);
        Color prevColor = default(Color);

        foreach (var quad in _view.GeomitryList)
        {

            if (prevColor != quad.Color)
            {
                GL.Color4(quad.Color);
                prevColor = quad.Color;
            }


            GL.Vertex2(quad.UpperLeftBound.X, quad.UpperLeftBound.Y);
            GL.Vertex2(quad.LowerRightBound.X, quad.UpperLeftBound.Y);
            GL.Vertex2(quad.LowerRightBound.X, quad.LowerRightBound.Y);
            GL.Vertex2(quad.UpperLeftBound.X, quad.LowerRightBound.Y);


        }


        GL.Color4(_unitColor); // reset color multiplier to not scew textures
        prevColor = _unitColor;

        GL.BindTexture(TextureTarget.Texture2D, _rockTextureId);

        foreach (var sprite in _view.SpriteList)
        {
            float ulX = sprite.UpperLeftBound.X;
            float ulY = sprite.UpperLeftBound.Y;
            float lrX = sprite.LowerRightBound.X;
            float lrY = sprite.LowerRightBound.Y;

            GL.TexCoord2(0, 0); GL.Vertex2(ulX, ulY);
            GL.TexCoord2(1, 0); GL.Vertex2(lrX, ulY);
            GL.TexCoord2(1, 1); GL.Vertex2(lrX, lrY);
            GL.TexCoord2(0, 1); GL.Vertex2(ulX, lrY);
        }

        RenderDashboard(ref prevColor);


        GL.End();

        GL.Flush();
        SwapBuffers();
    }
4

1 回答 1

0

假设您在MakeTransparent函数中设置 alpha 通道,您还需要启用混合:

受保护的覆盖无效 OnRenderFrame(FrameEventArgs e) { base.OnRenderFrame(e);

    GL.Clear(ClearBufferMask.ColorBufferBit);

    GL.Begin(BeginMode.Quads);
    Color prevColor = default(Color);

    foreach (var quad in _view.GeomitryList)
    {

        if (prevColor != quad.Color)
        {
            GL.Color4(quad.Color);
            prevColor = quad.Color;
        }


        GL.Vertex2(quad.UpperLeftBound.X, quad.UpperLeftBound.Y);
        GL.Vertex2(quad.LowerRightBound.X, quad.UpperLeftBound.Y);
        GL.Vertex2(quad.LowerRightBound.X, quad.LowerRightBound.Y);
        GL.Vertex2(quad.UpperLeftBound.X, quad.LowerRightBound.Y);


    }

vvv

    GL.Enable(GL_BLEND);

^^^

    GL.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    GL.Color4(_unitColor); // reset color multiplier to not scew textures
    prevColor = _unitColor;

    GL.BindTexture(TextureTarget.Texture2D, _rockTextureId);

    foreach (var sprite in _view.SpriteList)
    {
        float ulX = sprite.UpperLeftBound.X;
        float ulY = sprite.UpperLeftBound.Y;
        float lrX = sprite.LowerRightBound.X;
        float lrY = sprite.LowerRightBound.Y;

        GL.TexCoord2(0, 0); GL.Vertex2(ulX, ulY);
        GL.TexCoord2(1, 0); GL.Vertex2(lrX, ulY);
        GL.TexCoord2(1, 1); GL.Vertex2(lrX, lrY);
        GL.TexCoord2(0, 1); GL.Vertex2(ulX, lrY);
    }

    GL.End(); // I think this should go here.

    GL.Disable(GL_BLEND); // enable and disable on a as-needed base

    RenderDashboard(ref prevColor);


    GL.Flush();
    SwapBuffers();

顺便说一句:您在那里使用即时模式调用(glBegin(...),glVertex(...),glEnd()),您应该放弃它们并改用顶点数组和顶点缓冲区对象。立即模式已弃用,在 OpenGL-3 和更高版本的兼容性配置文件之外不再可用。

于 2011-04-12T06:43:52.527 回答