【问题标题】:Black screen in LWJGLLWJGL 中的黑屏
【发布时间】:2013-05-12 21:48:41
【问题描述】:

我目前正在移植一个游戏,由于从 C 移植到 Java,代码非常模糊。

我的问题是一些用户报告黑屏并且没有其他问题(例如声音工作正常),没有错误显示问题。在我的电脑上它运行良好,而且调试非常麻烦。

我想知道是否有人可以发布可能发生这种情况的(列表)原因。我在某处读过其中一个问题可能是在 64 位系统上使用 32 位 Java。

我的代码如下,也开源于:https://code.google.com/p/jake2t/

    private void renderSideBySide() {
        glBindTexture(GL_TEXTURE_2D, 0);
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, sbsFboId);

        // Render side by side
        glPushAttrib(GL_ALL_ATTRIB_BITS);
        glPushMatrix();

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, width, 0, height);
        glMatrixMode (GL_MODELVIEW);
        glLoadIdentity ();

        glViewport(0,0,width,height);


        glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glDisable(GL_DEPTH_TEST);
        glDisable(GL_LIGHTING);
        glDisable(GL_BLEND);
        glDisable(GL_ALPHA_TEST);
        glDisable(GL_CULL_FACE);

        int shaderId = sbsShader.getId();
        glDisable(GL_TEXTURE_2D);

        ARBShaderObjects.glUseProgramObjectARB(shaderId);

        if (postFboTextureLocation[0] < 0) {
            postFboTextureLocation[0] = ARBShaderObjects.glGetUniformLocationARB(shaderId, "leftTexture");
        }
        if (postFboTextureLocation[1] < 0) {
            postFboTextureLocation[1] = ARBShaderObjects.glGetUniformLocationARB(shaderId, "rightTexture");
        }
        if (postFboDepthTextureLocation[0] < 0) {
            postFboDepthTextureLocation[0] = ARBShaderObjects.glGetUniformLocationARB(shaderId, "leftDepthTexture");
        }
        if (postFboDepthTextureLocation[1] < 0) {
            postFboDepthTextureLocation[1] = ARBShaderObjects.glGetUniformLocationARB(shaderId, "rightDepthTexture");
        }

        // Load the images with the colors and the depth values
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, postFboTextureId[0]);
        ARBShaderObjects.glUniform1iARB(postFboTextureLocation[0], 0); 
        glActiveTexture(GL_TEXTURE1);
        glBindTexture(GL_TEXTURE_2D, postFboTextureId[1]);
        ARBShaderObjects.glUniform1iARB(postFboTextureLocation[1], 1); 
        glActiveTexture(GL_TEXTURE2);
        glBindTexture(GL_TEXTURE_2D, postFboDepthTexture[0]);
        ARBShaderObjects.glUniform1iARB(postFboDepthTextureLocation[0], 2); 
        glActiveTexture(GL_TEXTURE3);
        glBindTexture(GL_TEXTURE_2D, postFboDepthTexture[1]);
        ARBShaderObjects.glUniform1iARB(postFboDepthTextureLocation[1], 3); 

        glBegin (GL_QUADS);
        glTexCoord2f(0.0f, 0.0f);
        glVertex2i (0, 0);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2i (width, 0);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2i (width, height);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2i (0, height); 
        glEnd();                                                    

        ARBShaderObjects.glUseProgramObjectARB(0);

        // Rendering with warping
        glPopMatrix();
        glPopAttrib();

        unbindFBO();
    }

    public void drawPostFBOs() {
        renderSideBySide();

        glPushAttrib(GL_ALL_ATTRIB_BITS);
        glPushMatrix();

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, width, 0, height);
        glMatrixMode (GL_MODELVIEW);
        glLoadIdentity ();

        glViewport(0,0,width,height);


        glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
        glClear (GL_COLOR_BUFFER_BIT);

        glDisable(GL_DEPTH_TEST);
        glDisable(GL_LIGHTING);
        glDisable(GL_BLEND);
        glDisable(GL_ALPHA_TEST);
        glDisable(GL_CULL_FACE);
        glDisable(GL_TEXTURE_2D);

        int shaderId = riftShader.getId();

        ARBShaderObjects.glUseProgramObjectARB(shaderId);

        if (sbsFboTextureLocation < 0) {
            sbsFboTextureLocation = ARBShaderObjects.glGetUniformLocationARB(shaderId, "tex");
        }

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, sbsFboTextureId);
        ARBShaderObjects.glUniform1iARB(sbsFboTextureLocation, 0); 

        glBegin (GL_QUADS);
        glTexCoord2f(0.0f, 0.0f);
        glVertex2i (0, 0);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2i (width, 0);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2i (width, height);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2i (0, height); 
        glEnd();                                                    

        ARBShaderObjects.glUseProgramObjectARB(0);


        glPopMatrix();
        glPopAttrib();
    }

【问题讨论】:

  • EXTFramebuffer 可能是问题所在。尝试切换到 ARB 或核心。 AFAIK 一些 EXT 不受新驱动程序的支持(尽管它们应该支持)。

标签: opengl lwjgl


【解决方案1】:

OpenGL 3+程序员在编码时不考虑的常见问题有:

OpenGL 扩展

  • 使用 ARBEXT 扩展。
  • 使用正确的 OGL 扩展。
  • 使用不同 OGL 扩展的多种实现。下面是一个使用 C++ 的示例:

    #ifndef _MESA_INVERT_
        /*** ... some codes here ... ***/ 
    #else
        /*** ... alt some codes here ... ***/ 
    #endif
    

检查显卡是否支持以下扩展:

  • glxinfo - 基于 Linux 和 MacOS X 的系统。
  • glview - 基于 Windows 的系统。

【讨论】:

  • 1.除了旧硬件之外,使用核心而不是扩展更好,那么为什么会出现这个错误呢? 2. LWJGL(或者更确切地说是 GLFW)不需要设置明确的 ogl 版本,因为它默认使用最新的版本(包括所有可用的扩展)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
相关资源
最近更新 更多