创建/渲染场景 2d 舞台后重置视口 [英] Resetting the viewport after creating/rendering a scene2d Stage

查看:11
本文介绍了创建/渲染场景 2d 舞台后重置视口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的游戏中,我正在使用自定义世界坐标系绘制场景 2d Stage.

In my game I am drawing a scene2d Stage using a custom world coordinate system.

然后我想绘制一个带有一些文本的调试 UI,例如 FPS,但只是使用屏幕坐标,即文本位于屏幕右上角的位置.我的主要渲染方法如下所示:

I then want to draw a debug UI with some text like FPS on top of that, but simply using screen coordinates, i.e. where the text is positioned in the upper right corner of the screen. My main render method looks something like this:

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    gameStage.act(delta);
    gameStage.draw();

    debugInfo.render(delta);
}

Stage 设置自定义视口:

public GameStage(GameDimensions dimensions, OrthographicCamera camera) {
    // mapWith will be smaller than screen width
    super(new FitViewport(dimensions.mapWidth, dimensions.mapHeight, camera));
    ...
}

DebugInfo 渲染代码如下所示:

public DebugInfo() {
    Matrix4 mat = new Matrix4();
    mat.setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    batch.setProjectionMatrix(mat);
}

@Override
public void render(float delta) {
    batch.begin();
    font.setScale(2f);
    drawText("FPS " + Gdx.graphics.getFramesPerSecond());
    batch.end();
}

private void drawText(String text) {
    final BitmapFont.TextBounds textBounds = font.getBounds(text);
    textPos.x = Gdx.graphics.getWidth() - textBounds.width - MARGIN;
    textPos.y = Gdx.graphics.getHeight() - MARGIN;
    textPos.z = 0;
    font.draw(batch, text, textPos.x, textPos.y);
}

问题是即使我没有参考舞台的世界系统或它的相机,而是严格使用像素值和相应的投影矩阵,文本出现在舞台视口的右上角,即 比屏幕小.我希望它看起来与屏幕角落的舞台分离.

The problem is that even though I make no reference whatsoever to the stage's world system or its camera, but strictly use pixel values and an according projection matrix, the text appears in the upper right corner of the stage's viewport, which is smaller than the screen. I want it to appear detached from the stage in the screen's corner instead.

我可以将问题归结为 Stage 实例本身的创建;停下来画它是不够的.我实际上必须删除对 super(new FitViewport(...)) 的调用以防止这种情况发生.

I could pinpoint the problem down to the creation of the Stage instance itself; stopping to draw it is not enough. I actually have to remove the call to super(new FitViewport(...)) to prevent this from happening.

这让我相信我需要在渲染 UI 叠加层之前以某种方式重置渲染管道的视口?我该怎么做?

This leads me to believe that I need to somehow reset the viewport of the rendering pipeline before I render the UI overlay? How would I do that?

推荐答案

我的第一个答案是错误的.现在,当我查看 Viewport 源代码时,我可以看到它使用了 OpenGL 的 glViewPort 实际上它会影响所有后续的绘图调用.所以你必须在渲染你的东西之前用适当的尺寸调用 glViewport:

My first answer was wrong. Now, when I've looked into Viewport source code I can see that it uses OpenGL's glViewPort and indeed it affects all subsequent draw calls. So you have to call glViewport with appropriate dimensions before rendering your stuff:

@Override
public void render(float delta) {
    Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    batch.begin();
    font.setScale(2f);
    drawText("FPS " + Gdx.graphics.getFramesPerSecond());
    batch.end();
}

这篇关于创建/渲染场景 2d 舞台后重置视口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆