2012-03-09 2 views
6

Хотя у меня есть базовые знания OpenGL, я только начинаю с libgdx.libgdx: SpriteBatch не отображается с PerspectiveCamera

Мой вопрос: почему, имея тот же самый код, но только переключение с OrthographicCamera на PerspectiveCamera приводит к тому, что больше не отображается какой-либо из моих SpriteBatches?

Вот код, я использую:

создавание() метод:

public void create() { 
    textureMesh = new Texture(Gdx.files.internal("data/texMeshTest.png")); 
    textureSpriteBatch = new Texture(Gdx.files.internal("data/texSpriteBatchTest.png")); 

    squareMesh = new Mesh(true, 4, 4, 
      new VertexAttribute(Usage.Position, 3, "a_position") 
      ,new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoords") 

    ); 

    squareMesh.setVertices(new float[] { 
      squareXInitial, squareYInitial, squareZInitial,    0,1, //lower left 
      squareXInitial+squareSize, squareYInitial, squareZInitial, 1,1, //lower right 
      squareXInitial, squareYInitial+squareSize, squareZInitial, 0,0, //upper left 
      squareXInitial+squareSize, squareYInitial+squareSize, squareZInitial,1,0}); //upper right 

    squareMesh.setIndices(new short[] { 0, 1, 2, 3}); 

    spriteBatch = new SpriteBatch();   
} 

и метод визуализации():

public void render() { 
    GLCommon gl = Gdx.gl; 

    camera.update(); 
    camera.apply(Gdx.gl10); 
    spriteBatch.setProjectionMatrix(camera.combined); 

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 

    gl.glEnable(GL10.GL_TEXTURE_2D); 
    textureMesh.bind(); 
    squareMesh.render(GL10.GL_TRIANGLE_STRIP, 0, 4); 

    spriteBatch.begin(); 
    spriteBatch.draw(textureSpriteBatch, -10, 0); 
    spriteBatch.end();   
} 

Теперь, если в моем изменении размера (ширина ИНТ , int height). Я настраиваю камеру следующим образом:

public void resize(int width, int height) { 
     float aspectRatio = (float) width/(float) height; 
     camera = new OrthographicCamera(cameraViewHeight * aspectRatio, cameraViewHeight); 

я получаю это:

enter image description here

Но если изменить тип камеры:

public void resize(int width, int height) { 
    float aspectRatio = (float) width/(float) height; 
    camera = new PerspectiveCamera(64, cameraViewHeight * aspectRatio, cameraViewHeight); 
}  

я получаю это:

enter image description here

Причина, почему я спрашиваю потому что мне очень понравилась встроенная способность libgdx рисовать текст (шрифт) в OpenGL. Но в своих примерах они используют SpriteBatch, к которому они обращаются к экземпляру Font, и они также всегда используют Ortho Camera. Я хотел бы знать, если функция SpriteBatch и Font будет работать с PerspectiveCamera.

+0

При использовании PerspectiveCamera я думаю, что [Декаль] (http://code.google.com/p/libgdx-users/wiki/Decals) и классы DecalBatch - это то, что авторы libgdx намеревались использовать. – Sundae

+0

Код содержит слишком длинные строки (прокручиваемый код по горизонтали не крут) (также в ответе) –

+0

, кстати, я думаю, вы можете просто использовать 2 камеры - все, что они делают, скрывает «страшные» вычисления матрицы за «простыми» абстракции. –

ответ

4

Ну, хорошо, я решил это:

Короткий ответ:

SpriteBatch использует OrthogonalPerspective внутренне. Если вы используете PerspectiveCamera, вам нужно передать настраиваемую матрицу представлений в SpriteBatch. Вы можете сделать это в методе изменить размер (...):

@Override 
public void resize(int width, int height) { 
    float aspectRatio = (float) width/(float) height; 
    camera = new PerspectiveCamera(64, cameraViewHeight * aspectRatio, cameraViewHeight); 
    viewMatrix = new Matrix4(); 
    viewMatrix.setToOrtho2D(0, 0,width, height); 
    spriteBatch.setProjectionMatrix(viewMatrix); 
} 

И тогда нет необходимости делать что-нибудь еще с проекционной матрицей этого спрайта (если вы не хотите, чтобы изменить способ отображения спрайтов на экране):

public void render() { 
    GLCommon gl = Gdx.gl; 

    camera.update(); 
    camera.apply(Gdx.gl10); 
    //this is no longer needed: 
    //spriteBatch.setProjectionMatrix(camera.combined); 
    //... 

Длинный ответ: поскольку моя конечная цель должна была быть в состоянии использовать SpriteBatch для рисования текста, в то время как с указанной выше модификации моего кода я могу сделать это, в том смысле, что и текст на спрайт и сетка с текстурой теперь видна, я заметил, что если я не укажу цвет для вершин моей сетки, указанные вершины получат цвет, который я использую для текста. Другими словами, текстурированная сетка объявлена ​​так:

squareMesh = new Mesh(true, 4, 4, 
      new VertexAttribute(Usage.Position, 3, "a_position") 
      ,new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoords") 

    ); 

    squareMesh.setVertices(new float[] { 
      squareXInitial, squareYInitial, squareZInitial,    0,1, //lower left 
      squareXInitial+squareSize, squareYInitial, squareZInitial, 1,1, //lower right 
      squareXInitial, squareYInitial+squareSize, squareZInitial, 0,0, //upper left 
      squareXInitial+squareSize, squareYInitial+squareSize, squareZInitial,1,0}); //upper right 

    squareMesh.setIndices(new short[] { 0, 1, 2, 3}); 

также имеющий этот код в моем рендере (...метод) сделает сетки красного оттенка:

font.setColor(Color.RED); 
spriteBatch.draw(textureSpriteBatch, 0, 0); 
font.draw(spriteBatch, (int)fps+" fps", 0, 100); 

Исправление для этого, чтобы установить цвета на вершинах вашего меша с самого начала:

squareMesh = new Mesh(true, 4, 4, 
     new VertexAttribute(Usage.Position, 3, "a_position") 
     ,new VertexAttribute(Usage.ColorPacked, 4, "a_color") 
     ,new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoords") 

); 

squareMesh.setVertices(new float[] { 
     squareXInitial, squareYInitial, squareZInitial,       Color.toFloatBits(255, 255, 255, 255), 0,1, //lower left 
     squareXInitial+squareSize, squareYInitial, squareZInitial,    Color.toFloatBits(255, 255, 255, 255), 1,1, //lower right 
     squareXInitial, squareYInitial+squareSize, squareZInitial,    Color.toFloatBits(255, 255, 255, 255), 0,0, //upper left 
     squareXInitial+squareSize, squareYInitial+squareSize, squareZInitial, Color.toFloatBits(255, 255, 255, 255), 1,0}); //upper right 

squareMesh.setIndices(new short[] { 0, 1, 2, 3}); 
Смежные вопросы