1

私は織り目加工のスカイドームを持っています。画像が添付されている場合は白でレンダリングされますが、色が指定されている場合は正しくレンダリングされます。テクスチャが上書きされていると仮定する理由があるため、これに関するいくつかのヒントが役立ちます。以前は正常に機能し、テクスチャを適切に表示していました。

編集: テクスチャを直接 fbo に出力すると、テクスチャが表示されます。ただし、球にマップすると、白く表示されます。球に色を付けると、その色で正しく表示されます。また、白はクリアカラーではありません。そして、かなり大きな画像(3000x1000〜)を使用しています。

追加: エラーはどこにも表示されません。

変化:

glActiveTextureARB(GL_TEXTURE6_ARB);
glCallList(SkySphere.getDisplayList());

に:

glActiveTextureARB(GL_TEXTURE0_ARB);
glCallList(SkySphere.getDisplayList());

適切な画像を 1 回表示し、最初のサイクルを表示してから、再び白を表示します。

    glBindTexture(GL_TEXTURE_2D, 0);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);

    glViewport(0,0,screenWidth,screenHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.0f, ((float)screenWidth/(float)screenHeight),0.1f,100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,
        GL_NICEST);
    glDisable(GL_DEPTH_TEST);
    glClearColor(1.0f,1.0f,0.0f,1.0f);
    glClear (GL_COLOR_BUFFER_BIT);

    glLoadIdentity (); 

    camera.look();
    glEnable(GL_TEXTURE_2D);
    glDisable(GL_LIGHTING);

    glActiveTextureARB(GL_TEXTURE6_ARB);
    glCallList(SkySphere.getDisplayList());

    glDisable(GL_TEXTURE_2D);

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

これはスカイスフィアのコードです:

public static int loadTexture(String filename) {
        ByteBuffer buf = null;
        int tWidth = 0;
        int tHeight = 0;

        .. load png into buffer..

        // Create a new texture object in memory and bind it
        textureId = GL11.glGenTextures();
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId);

        // All RGB bytes are aligned to each other and each component is 1 byte
        GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);

        // Upload the texture data and generate mip maps (for scaling)
        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, tWidth, tHeight, 0, 
                        GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buf);          
        // Setup what to do when the texture has to be scaled
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, 
                        GL11.GL_NEAREST);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, 
                        GL11.GL_LINEAR);


        return textureId;
}

public static int getDisplayList() {
    return displayList;
}

public static int makeSphere() {
    Sphere s = new Sphere();       // an LWJGL class for drawing sphere
    s.setOrientation(GLU.GLU_INSIDE);  // normals point inwards
    s.setTextureFlag(true);           // generate texture coords
    displayList = GL11.glGenLists(1);
    GL11.glNewList(displayList, GL11.GL_COMPILE);
    {
        GL11.glPushMatrix();
        {
                    GL11.glBindTexture(GL11.GL_TEXTURE_2D, getTextureId());
            //GL11.glTranslatef(0,0,0);
            GL11.glRotatef(90f, 1,0,0);     // rotate the sphere to align the axis vertically
            s.draw(1, 48, 48);              // run GL commands to draw sphere
        }
        GL11.glPopMatrix();
    }
    GL11.glEndList();
    return displayList;
}

initGL では:

    SkySphere.createShader();
    SkySphere.loadTexture("textures/panorama2.png");
    SkySphere.makeSphere();

また、私はフレームバッファでほとんどの作業を行っています:

    glBindTexture(GL_TEXTURE_2D, 0);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, modelsFboId);

ある場合には、深度をテクスチャにコピーします。

    glActiveTextureARB(GL_TEXTURE3_ARB);
    glBindTexture(GL_TEXTURE_2D, modelsDepthTextureId);
    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, screenWidth, screenHeight);
    glBindTexture(GL_TEXTURE_2D, 0);

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);    
4

1 に答える 1

0

使った

    glPushAttrib(GL_ALL_ATTRIB_BITS);

冒頭と

    glPopAttrib();

最後に、フレームごとに OpenGL の状態をリセットします。

于 2012-08-14T22:00:11.673 に答える