OpenGl 2D sprites Z-Order - >启用深度测试会产生图形错误

时间:2014-11-16 21:48:41

标签: java opengl lwjgl z-order

我在使用OpenGL中的Z排序时遇到问题(仅限2D) 我写了一个类,它将精灵对象列表呈现给屏幕。精灵对象有一个距离属性,它告诉他们离相机有多远 当我读到在openGL中绑定纹理很慢时,我试图将纹理的绑定减少到最小 这是通过拥有>的地图来完成的。因此,使用相同纹理的所有精灵对象都保存在列表中。在渲染时,首先将纹理绑定,然后渲染具有此纹理的所有对象。然后它绑定下一个纹理并为此等呈现所有对象 现在的问题是:虽然我使用vertex3F来渲染对象,但它们没有正确排序。意思是:应该远离的物体在尽可能接近的物体上渲染 我也可以通过使用LEQUAL函数启用深度测试来解决这个问题。但是现在我有以下渲染错误: enter image description here 这行三角形从左上角开始,所有屏幕都在右下角。

我不知道这个错误来自哪里。 有人知道是什么导致了这个错误以及如何修复它?

以下是相关代码: 初始化:

GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, p_resolutionWidth, 0, p_resolutionHeight, 1, -1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);

GL11.glClearDepth(1.0f); 
GL11.glEnable(GL11.GL_DEPTH_TEST); 
GL11.glDepthFunc(GL11.GL_LEQUAL);

GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

渲染所有精灵:

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glPushMatrix();



for(Sprite sprite : m_sortedSprites.keySet()) {
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, sprite.texture().getTextureID());

    GL11.glBegin(GL11.GL_QUADS);
    for(SpriteSceneObject spriteObject : m_sortedSprites.get(sprite)) {
        Rectangle rectangle = new Rectangle(spriteObject.position(), sprite.width(), sprite.height());

        if(p_camera.isVisible(rectangle)) {
            renderSprite(spriteObject, p_camera);
        }

    }
    GL11.glEnd();
}

SceneManager.setOpenGLColour(Colour.WHITE);

GL11.glPopMatrix();
GL11.glDisable(GL11.GL_TEXTURE_2D);

渲染一个精灵:

private void renderSprite(SpriteSceneObject p_spriteObject, CameraSceneObject p_camera) {
    Sprite sprite = p_spriteObject.sprite();
    Rectangle rectangle = new Rectangle(p_spriteObject.position(), sprite.width(), sprite.height());
    Vector2 upperLeft = p_camera.worldToGraphicsCoordinate(rectangle.upperLeft());
    Vector2 upperRight = p_camera.worldToGraphicsCoordinate(rectangle.upperRight());
    Vector2 lowerRight = p_camera.worldToGraphicsCoordinate(rectangle.lowerRight());
    Vector2 lowerLeft = p_camera.worldToGraphicsCoordinate(rectangle.lowerLeft());

    Colour colour = p_spriteObject.colour();

    SceneManager.setOpenGLColour(colour);

    GL11.glTexCoord2f(0, 0); // Upper Left
    GL11.glVertex3f(upperLeft.x(), upperLeft.y(), p_spriteObject.distance().distance());

    GL11.glTexCoord2f(1, 0); // Upper Right
    GL11.glVertex3f(upperRight.x(), upperRight.y(), p_spriteObject.distance().distance());

    GL11.glTexCoord2f(1, 1); // Lower Right
    GL11.glVertex3f(lowerRight.x(), lowerRight.y(), p_spriteObject.distance().distance());

    GL11.glTexCoord2f(0, 1); // Lower Left
    GL11.glVertex3f(lowerLeft.x(), lowerLeft.y(), p_spriteObject.distance().distance());
}

我知道可能的修复方法是按距离对所有精灵进行排序,然后再渲染它们。我也试过这个并且它有效。但是后来不可能聚集使用相同纹理的精灵,因此我必须绑定每个纹理而不是一次,这是不可能的。

0 个答案:

没有答案