【问题标题】:libGDX - Drawing Texture via SpriteBatch Result FliplibGDX - 通过 SpriteBatch 结果翻转绘制纹理
【发布时间】:2015-05-01 16:13:14
【问题描述】:

当我尝试使用SpriteBatch 绘制Texture 时,结果翻转如下:

这是我的工作: 我创建了MyRect 绘制边界矩形和图像的对象。

这里MyRect课堂预览:

public class MyRect {
private Vector2 position;
private int width;
private float height;

private Texture img;
private Sprite sprite;

public MyRect(int x, int y, int width, int height){
    img = new Texture("badlogic.jpg");
    sprite = new Sprite(img);

    position = new Vector2(x,y);
    this.width = width;
    this.height = height;
}

public void draw(ShapeRenderer shapeRenderer, SpriteBatch batch){
    // Gdx.gl.glClearColor(0, 0, 0, 1);
    // Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    shapeRenderer.begin(ShapeType.Line);

    // Draw Background color
    shapeRenderer.setColor(55 / 255.0f, 80 / 255.0f, 100 / 255.0f, 1);
    shapeRenderer.rect(position.x, position.y, width, height);

    shapeRenderer.end();

    batch.begin();
    // batch.disableBlending();
    batch.draw(img, position.x, position.y, 
            width, height);
    batch.end();
}
}

参数ShapeRendererSpriteBatch通过GameScreen类传递。

GameScreen预览:

public class GameScreen implements Screen{
private MyRect myRect;
private ShapeRenderer shapeRenderer;
private SpriteBatch batch;
private OrthographicCamera cam;

public GameScreen(){
    myRect = new MyRect(10,10,50,50);

    int gameHeight=100;
    cam = new OrthographicCamera();
    cam.setToOrtho(true, 136, gameHeight);

    batch = new SpriteBatch();
    batch.setProjectionMatrix(cam.combined);

    shapeRenderer = new ShapeRenderer();
    shapeRenderer.setProjectionMatrix(cam.combined);
}

@Override
public void render(float delta) {
    // TODO Auto-generated method stub
    myRect.draw(shapeRenderer, batch);
}
}

为什么会这样?我做错了吗?

【问题讨论】:

    标签: java android ios opengl-es libgdx


    【解决方案1】:

    您的相机倒置了,因为您在上面调用了setToOrtho(true, ...) 而不是setToOrtho(false, ...)

    使用倒置相机是有效的(如果您以前使用过 Flash 或其他一些 Y-down 系统可能会更舒服),但是您需要翻转所有 TextureRegions(又名 Sprites):@ 987654323@。或者,您可以使用 TexturePacker 创建一个 TextureAtlas(在 libgdx 文档中查找)并设置 flipY 选项,以便它提前为您翻转它们。最终,为了提高性能,无论如何您都需要使用 TextureAtlas。

    顺便说一句,当您开始绘制 MyRect 的多个实例时,您需要将 spriteBatch.begin()end()shapeRenderer.begin()end() 从单独的 MyRect 的 draw 方法中移出,否则您将运行陷入性能问题。因此,需要有两种绘制方法(一种用于精灵批处理,一种用于形状渲染器)。

    【讨论】:

    • 解决了我的问题。谢谢。但是,如果我使用“倒置”相机,为什么它会画“翻转”?
    • OpenGL 将 Y 视为向上。要使 Y 点向下,相机必须垂直镜像屏幕。
    • 还有为什么spriteBatch.begin()end()shapeRenderer.begin()end()会造成性能问题?
    • 精灵批处理的要点是将许多精灵组合成一个数据数组,这样它们就可以只传递给GPU一次,而不是每个精灵都传递一次,这样可以节省很多时间。每次调用 end() 时,它都会将所有数据发送到 GPU 并重新开始。理想情况下,end() 只应在整个游戏中调用一次,但您可能有理由不这样做,例如绘制 FBO 或将精灵混合到 3D 场景中或使用各种不同的着色器。这也适用于 ShapeRenderer。
    【解决方案2】:

    显然,我看到的唯一与我所做的不同的事情是尝试改变: 如果它适用于“测试”

    cam.setToOrtho(false, 136, gameHeight);
    

    这就是我使用相机的方式。

    我不知道是否使用true,你必须做一些不同的方式,绘制批次,反正。如果相机是假的,它看起来不错,我认为它必须在绘制uv之前翻转图像

    【讨论】:

      猜你喜欢
      • 2014-09-05
      • 1970-01-01
      • 2014-05-10
      • 2019-10-17
      • 2014-10-28
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多