LWJGL全屏保持宽高比?

时间:2015-03-02 21:14:50

标签: fullscreen lwjgl aspect-ratio fbo render-to-texture

我想要一个全屏模式,通过在任一侧添加黑条来保持纵横比。我尝试创建一个显示模式,但除非它是预先批准的分辨率,否则我无法全屏显示,当我使用比原始分辨率更大的diaplay时,像素变得混乱,并且在两者之间出现线条由于某种原因,游戏中的所有瓷砖。

我认为我需要使用FBO将场景渲染为纹理而不是窗口,然后使用全屏批准的分辨率并将纹理正确地拉伸到屏幕中央,但我只是不要#39 ;了解如何渲染纹理以实现这一目标,或如何拉伸图像。有人可以帮助我吗?

修改

我得到了全屏工作,但是它让所有东西都破碎了。在窗口上任何东西的边缘都有随机的线条。但是,当它采用原始分辨率时,没有任何毛刺线。这是我的代码:

    Display.setTitle("Mega Man");

    try{
        Display.setDisplayMode(Display.getDesktopDisplayMode());
        Display.create();
    }catch(LWJGLException e){
        e.printStackTrace();
    }

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,WIDTH,HEIGHT,0,1,-1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);

    try{Display.setFullscreen(true);}catch(Exception e){}

    int sh=Display.getHeight();
    int sw=WIDTH*sh/HEIGHT;
    GL11.glViewport(Display.getWidth()/2-sw/2, 0, sw, sh);

这里的故障全屏截图:http://sta.sh/021fohgnmxwa

修改

这是我用来绘制所有内容的纹理渲染代码:

public static void DrawQuadTex(Texture tex, int x, int y, float width, float height, float texWidth, float texHeight, float subx, float suby, float subd, String mirror){

    if (tex==null){return;}
    if (mirror==null){mirror = "";}

    //subx, suby, and subd are to grab sprites from a sprite sheet. subd is the measure of both the width and length of the sprite, as only images with dimensions that are the same and are powers of 2 are properly displayed.

    int xinner = 0;
    int xouter = (int) width;
    int yinner = 0;
    int youter = (int) height;

    if (mirror.indexOf("h")>-1){
        xinner = xouter;
        xouter = 0;
    }

    if (mirror.indexOf("v")>-1){
        yinner = youter;
        youter = 0;
    }

    tex.bind();
    glTranslatef(x,y,0);

    glBegin(GL_QUADS);
    glTexCoord2f(subx/texWidth,suby/texHeight);
    glVertex2f(xinner,yinner);
    glTexCoord2f((subx+subd)/texWidth,suby/texHeight);
    glVertex2f(xouter,yinner);
    glTexCoord2f((subx+subd)/texWidth,(suby+subd)/texHeight);
    glVertex2f(xouter,youter);
    glTexCoord2f(subx/texWidth,(suby+subd)/texHeight);
    glVertex2f(xinner,youter);

    glEnd();

    glLoadIdentity();
}

1 个答案:

答案 0 :(得分:0)

为了保持清洁,我给你一个真正的答案而不只是评论。

纵横比问题可以通过glViewport解决。使用此方法,您可以决定要渲染到的曲面的哪个区域。默认视口将覆盖整个表面。

由于在更改视口后出现了第二个腐败渲染问题(此处也称为https://stackoverflow.com/questions/28846531/sprite-game-in-full-screen-aliasing-issue),我也会在这个答案中给出我的想法。

不知道拼贴背景的渲染代码究竟如何。我猜这个问题是由于glViewport和glOrtho调用之间的分辨率有任何差异。 示例:如果glOrtho分辨率是视口分辨率的一半,则每个openGL单位实际上是2个像素。如果你然后在x = 0和x = 9之间渲染一个瓦片,然后是x = 10和x = 19之间的下一个瓦片,你将在它们之间得到一个空的空格。

要解决此问题,您可以更改分辨率,使它们相同。或者你可以渲染瓷砖重叠,首先是x = 0到x = 10秒,x = 10到x = 20,依此类推。

虽然没有看到平铺渲染代码,但我无法验证它是否存在问题。