2013-05-12 73 views
0

我目前正在移植一个游戏,其代码由于从C移植到Java而非常模糊。LWJGL中的黑屏

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

我想知道是否有人可以发布可能发生的(列表)原因。我已经读过某个地方可能会在64位系统上使用32位Java的问题。

我下面的代码,也opensourced在: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(); 
    } 
+0

EXTFramebuffer可能是问题所在。尝试切换到ARB或核心。 AFAIK一些EXT不支持(尽管它们应该)由更新的驱动程序。 – RecursiveExceptionException 2016-06-13 05:57:37

回答

0

常见的问题,当编码的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的系统。
+0

1.除了旧硬件,使用core over extensions更好,那么为什么这个bug是由于这个原因造成的? 2. LWJGL(或者说GLFW)不需要设置显式的ogl版本,因为它默认使用最新的(包括所有可用的扩展)。 – RecursiveExceptionException 2016-06-13 05:55:26