首页 文章

LWJGL / OpenGL - Alpha不能使用GL_QUAD_STRIP或GL_LINE_STRIP

提问于
浏览
0

我想将Alpha / Blend模式用于未来的东西(主要是交易和可能的图像混合) .

好吧,我无法使用LWJGL(GL1.1)工作,我已经尝试过其他混合模式但没有工作,也没有改变背景或类似的东西......

截图:

  • http://i.imgur.com/cHU4YGS.png - GL_BLEND始终启用,一切都是透明的

  • http://i.imgur.com/sPmPqne.png - 在QUAD和文本上启用了GL_BLEND,我可以看到禁用的行GL_BLEND

  • 我imgur com / nkda41v png - 除了文本之外的所有内容都禁用了GL_BLEND - >我需要一些声望来发布超过2个链接,抱歉,但我相信这个图像很重要,所以无论如何我都会发布它 . 只需填充点

所有这些测试的结果都是相同的,有或没有alpha参数

代码:

`    private void init() {
        try {
            Display.setDisplayMode(new DisplayMode(DEFAULT_WIDTH, DEFAULT_HEIGHT));
            Display.setResizable(true);
            Display.setVSyncEnabled(true);
            Display.setTitle(DEFAULT_TITLE + " v" + VERSION);
            Display.create();
            updateMatrix();
        } catch(LWJGLException e) {
            e.printStackTrace();
        }
        Keyboard.enableRepeatEvents(true);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    Font consolas = new Font("consolas", Font.PLAIN, 13);
    font = new TrueTypeFont(consolas, antiAliasedFont);
}

private void updateMatrix() {
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, DEFAULT_WIDTH, DEFAULT_HEIGHT, 0, 1, -1);
    //glScaled((double) DEFAULT_WIDTH / (double) Display.getWidth(), (double) DEFAULT_HEIGHT / (double) Display.getHeight(), 0);
    glViewport(0, 0, Display.getWidth(), Display.getHeight());
    glMatrixMode(GL_MODELVIEW);
}

@Override
public void run() {
    init();
    Main main = Main.getMain();

    while(!Display.isCloseRequested()) {
        currentGraphicsTick++;
        {
            glClear(GL_COLOR_BUFFER_BIT);
            glClearColor(0f, 0f, 0f, 1f);

            if(Display.wasResized()) updateMatrix();
            if(vsyncMode == 1) Display.setVSyncEnabled(true);
            else if(vsyncMode == 2) Display.setVSyncEnabled(false);

            if(Display.isActive()) {
                glPushMatrix();
                try { // Draw
                    float alpha = (float) Math.cos(Math.toRadians(currentGraphicsTick % 90));
                    System.out.println("Alpha: " + alpha);

                    glBegin(GL_LINE_STRIP);
                    {
                        float sin = (float) Math.abs(Math.sin(Math.toRadians(currentGraphicsTick % 360)));
                        new Color(0.7f, 0.7f, 0.7f, alpha).bind();
                        glVertex2f(DEFAULT_WIDTH * 0.03f, DEFAULT_HEIGHT * 0.05f);
                        glVertex2f(DEFAULT_WIDTH * 0.93f * sin, DEFAULT_HEIGHT * 0.95f * sin);
                    }
                    glEnd();

                    glBegin(GL_QUAD_STRIP);
                    {
                        new Color(0.5f, 0.5f, 0.5f, alpha).bind();
                        glVertex2i(0, 0);
                        glVertex2i(0, DEFAULT_HEIGHT);
                        glVertex2i(DEFAULT_WIDTH, 0);
                        glVertex2i(DEFAULT_WIDTH, DEFAULT_HEIGHT);
                    }
                    glEnd();

                    String[] split = main.getGameLoopThread().getDebugString().split("\n");
                    for(int i = 0; i < split.length; i++) {
                        font.drawString(1, 1 + (i * font.getLineHeight()), split[i], Color.white);
                    }
                } catch(Throwable throwable) {
                    throwable.printStackTrace();
                }
                glPopMatrix();
            }

            Display.update();
            Display.sync(TARGET_FPS);
        }
    }
    Display.destroy();
    closeRequested = true;
}

我已经尝试过了:

  • 从Slick的Color构造函数中删除'alpha'参数

  • 使用带有和不带alpha参数的OpenGL的 glColor

  • 在部分代码中禁用/启用 GL_BLEND (我知道有些东西不起作用,但你永远都不知道,对吧?)

  • 使用 constants 到alpha变量(例如0.3f,0.5f,0.7f,1f)而不是通过 Math.sin / cos 使用刻度作为度数使其变量

  • 使用 glRect(...)

  • 更改背景

  • 删除 glClearColor

  • 正在删除 glClear (效果很好,从未做过这个大声笑)

我期待看到的是一个正在消失的LINE_STRIP:

  • 一方面它从 (0, 0) 移动到 (width - 7%, height - 5%)

  • 另一方面,它仍然停留在 (width + 3%, height + 5%)

  • 矩形会让它变淡(最初的想法会使用与背景相同的颜色,但它在我的测试中没有,因为我想看到矩形)

2 回答

  • 0

    在使用我自己的引擎进行2D游戏时,我有类似的(就我必须解决的问题而言) . LWJGL的混合函数总是有一些问题,并没有真正那么多的具体答案,因为它真的归结为你的代码和你如何放置东西 .

    我认为你正在使用SlickUtil,我会说你自己编写(或者当然搜索)你自己的方法 . Util的方法总是有点混乱 .

    • 删除alpha在获得你想要的东西方面不应该有太大变化

    • 我唯一一次明确启用GL_BLEND是在渲染灯光时(总是假设你正在做3D)以及何时渲染纹理

    • 我建议不要删除glClearColor,只要你把它放在正确的地方就不会直接影响你的情况


    就像我说的这个错误/问题可能是由于很多事情,我不能完全指出你发布的内容 .

    我的建议是:

    • 很好地组织整个项目,以便能够快速指出错误

    • 尽快制作一些通用的东西(如果你只是想快速写东西,这无关紧要)

    • 避免SlickUtil,它是_2387103的问题


    抱歉,我不能帮助太多,但是从您发布的混乱代码中追踪您的问题有点困难 . 我将密切关注这个问题,以防我将来有所帮助 .

  • 0

    除了来自@Juxhin的提示之外,修复我的alpha混合问题的是来自SlickUtils的 TextureImpl.bindNone(); (查看下面的openGL类似)

    在渲染需要混淆的东西之前,此方法类似于 glDisable(GL_TEXTURE_2D) (我知道搜索和检查Slick的源代码)

相关问题