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

时间:2014-09-27 13:08:12

标签: java opengl lwjgl alpha blend

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

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

截图:

  1. http://i.imgur.com/cHU4YGS.png - GL_BLEND始终启用,一切都是透明的
  2. http://i.imgur.com/sPmPqne.png - 在QUAD和文字上启用了GL_BLEND,我可以看到已禁用的行GL_BLEND
  3. 我imgur com / nkda41v png - GL_BLEND已禁用除文字外的所有内容 - >我需要一些声誉才能发布超过2个链接,对此抱歉,但我相信这张图片非常重要,所以无论如何我都会发布它。只需填充点
  4. 在所有这些测试中,无论是否有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; }

    我已经尝试过:

    1. 删除&#39; alpha&#39;来自Slick的Color构造函数的参数
    2. 使用带有和不带alpha参数的OpenGL&lt; gl> glColor
    3. 在部分代码中禁用/启用 GL_BLEND (我知道有些事情不会奏效,但您永远不会知道,对吧?)
    4. 常量用于alpha变量(例如0.3f,0.5f,0.7f,1f),而不是通过 Math.sin <使其变量/ strong> / cos 使用tick作为学位
    5. 使用 glRect(...)
    6. 更改背景
    7. 删除 glClearColor
    8. 删除 glClear (效果很好,从未做过这个大声笑)
    9. 我期待看到的是一个正在消失的LINE_STRIP:

      • 一方面,它从(0,0)移动到(宽度 - 7%,高度 - 5%)

      • 另一方面,它仍停留在(宽度+ 3%,高度+ 5%)

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

2 个答案:

答案 0 :(得分:0)

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

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

  1. 删除alpha不应该在获取方面发生很大变化 你想要什么
  2. 我明确启用GL_BLEND的唯一时间是 渲染灯光时(总是假设你正在做3D)以及何时渲染纹理
  3. 我建议不要删除glClearColor,这不会直接影响你的情况 只要你把它放在正确的地方

  4. 就像我说的那样,这个错误/问题可能是由于我可以用你发布的内容指出的一些东西。

    我的建议是:

    1. 很好地组织整个项目,以便能够快速发现错误
    2. 尽快制作一些通用的东西(如果你只想快速写东西,那不重要)
    3. 避免使用SlickUtil,它太棒了,我很喜欢它,但它确实解决了它的问题

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

答案 1 :(得分:0)

除了来自@Juxhin的提示之外,解决我的alpha混合问题的是来自SlickUtils的 TextureImpl.bindNone(); (检查openGL&#39; s类似于下面)

此方法类似于 glDisable(GL_TEXTURE_2D),然后渲染需要混淆的东西(我知道搜索和检查Slick的源代码) < / p>