我在使用OpenGL中的Z排序时遇到问题(仅限2D) 我写了一个类,它将精灵对象列表呈现给屏幕。精灵对象有一个距离属性,它告诉他们离相机有多远 当我读到在openGL中绑定纹理很慢时,我试图将纹理的绑定减少到最小 这是通过拥有>的地图来完成的。因此,使用相同纹理的所有精灵对象都保存在列表中。在渲染时,首先将纹理绑定,然后渲染具有此纹理的所有对象。然后它绑定下一个纹理并为此等呈现所有对象 现在的问题是:虽然我使用vertex3F来渲染对象,但它们没有正确排序。意思是:应该远离的物体在尽可能接近的物体上渲染 我也可以通过使用LEQUAL函数启用深度测试来解决这个问题。但是现在我有以下渲染错误: 这行三角形从左上角开始,所有屏幕都在右下角。
我不知道这个错误来自哪里。 有人知道是什么导致了这个错误以及如何修复它?
以下是相关代码: 初始化:
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());
}
我知道可能的修复方法是按距离对所有精灵进行排序,然后再渲染它们。我也试过这个并且它有效。但是后来不可能聚集使用相同纹理的精灵,因此我必须绑定每个纹理而不是一次,这是不可能的。