0

私は現在、C から Java への移植のためにコードが非常に難読化されているゲームを移植しています。

私の問題は、一部のユーザーが黒い画面を報告し、他の問題は報告していないことです (サウンドは正常に動作しています)。エラーは問題を示していません。私のPCでは問題なく動作し、デバッグの地獄になります。

これが発生している可能性のある理由(のリスト)を誰かが投稿できるかどうか疑問に思っていました。問題の1つが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();
    }
4

1 に答える 1

0

OpenGL 3+ プログラマーがコーディング時に考慮しない一般的な問題は次のとおりです。

OpenGL 拡張機能

  • ARBおよびEXTエクステンションの使用。
  • 正しい OGL 拡張子の使用。
  • 異なる OGL 拡張機能の複数の実装を使用します。C++ を使用した例を次に示します。

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

以下を使用して、ビデオ カードが次の拡張子をサポートしているかどうかを確認します。

  • glxinfo - Linux および MacOS X ベースのシステム.
  • glview - Windows ベースのシステム.
于 2013-05-13T11:59:58.093 に答える