2015-03-02 4 views
0

Я хочу иметь полноэкранный режим, который поддерживает соотношение сторон, добавляя черные полосы с обеих сторон. Я попробовал просто создать режим отображения, но я не могу сделать его полноэкранным, если это не утвержденное разрешение, и когда я использую большую диапайлу, чем собственное разрешение, пиксели становятся испорченными, и между всеми фрагментами появляются строки игра по какой-то причине.LWJGL Fullscreen при сохранении пропорций?

Я думаю, мне нужно использовать FBOs для визуализации сценария к текстуре вместо окна, а затем просто использовать разрешенное полноэкранное разрешение и визуализировать текстуру, правильно растянутую в центре экрана, но я просто не знаю, t понять, как сделать текстуру, чтобы сделать это, или как растянуть изображение. Может кто-нибудь, пожалуйста, помогите мне?

EDIT

я получил в полноэкранном режиме работает, но он делает все, все сломанные глядя Есть случайные линии по краям всего, что это написанных к окну. Однако, если в родном разрешении нет глючных линий, их нет. Вот мой код:

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

Скриншот Glitchy полноэкранным здесь: http://sta.sh/021fohgnmxwa

EDIT

Вот код рендеринга текстур, которые я использую, чтобы сделать все:

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

Разве это не проблема, которая может быть исправлена ​​с помощью glViewport? Правильно настроив окно просмотра, вы должны удержать соотношение сторон так, как хотите. – PTosk

+0

@PTosk Спасибо! Хотя я получаю еще одну проблему. Я продолжаю видеть линии между всеми моими объектами, и все выглядит. Я загрузил свой код, чтобы настроить полноэкранный режим как редактирование на мой вопрос. – Entity1037

+0

Ссылка на скриншот не работает. – PTosk

ответ

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 и так далее.

Не видя кода рендеринга плитки, я не могу проверить, что это проблема.

+0

Я добавил код рендеринга плитки в качестве редактирования моего вопроса. – Entity1037

+0

Не большой поклонник использования int для координат, так как OpenGL использует float, но он не должен создавать такую ​​проблему. Не вижу никаких проблем в коде.Это может быть проблема с кровотечением из атласа текстуры, посмотрите http://stackoverflow.com/questions/7894802/opengl-texture-atlas-bleeding. – PTosk

+0

Я не уверен, что это проблема с кровотечением из атласа. Кроме того, пиксели в полноэкранном режиме также размыты, и я не думаю, что это может вызвать кровотечение из атласа. Здесь, попробуйте эту ссылку на скриншот: http://entity1037.deviantart.com/art/Glitchy-Fullscreen-Screenshot-517888561?ga_submit_new=10%253A1425611924&ga_type=edit&ga_changes=1&ga_recent=1 – Entity1037

Смежные вопросы