Вопрос

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

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

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

метод create():

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();        
}

и метод render():

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();        
}

Теперь, если в моем методе resize (int width, 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, к которому они ведут путь к экземпляру шрифта, и они также всегда используют Ortho Camera.Тогда я хотел бы знать, работают ли функции SpriteBatch и рисования шрифтов с PerspectiveCamera.

Это было полезно?

Решение

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

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

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

@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});

также наличие этого кода в моем методе render (...) сделает сетку окрашенной в красный цвет:

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});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top