我想要一个全屏模式,通过在任一侧添加黑条来保持纵横比。我尝试创建一个显示模式,但除非它是预先批准的分辨率,否则我无法全屏显示,当我使用比原始分辨率更大的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();
}
答案 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,依此类推。
虽然没有看到平铺渲染代码,但我无法验证它是否存在问题。