2016-02-25 95 views
3

我只是使用LWJGL 3設置了一個簡單的渲染器,當它在我的外部顯示器上運行時,它看起來像我期望的那樣,但是當它在我的Macbook上調整大小時,會縮小視口。然後,如果我移動窗口它修復它。以下是我啓動我的GL內容並調整窗口大小時運行的代碼。Macbook Pro上的glFrustum給出了意想不到的效果

public void resize(int width, int height) 
{ 
    val near = 0.1 
    val far = 100.0 

    GL11.glViewport(0, 0, width, height); 

    GL11.glMatrixMode(GL11.GL_PROJECTION); 
    GL11.glLoadIdentity(); 

    float aspect = width/(float)height 
    float fov = (float)(45.0/360.0 * Math.PI) 

    float fH = Math.tan(fov) * near 
    float fW = fH * aspect 
    GL11.glFrustum(-fW, fW, -fH, fH, near, far); 

    GL11.glMatrixMode(GL11.GL_MODELVIEW); 
    GL11.glLoadIdentity(); 
} 

這裏是我所看到的

錯誤 Looks Wrong Looks Right

如果我運行它在我的外部顯示器上它不改變,它永遠是對的。

+3

瘋狂的猜測:你的內部顯示器是一個視網膜顯示器?它看起來像是從窗口左下角到兩個屏幕截圖中呈現的對象之間的距離差異的一個因素。 – JWWalker

+0

也許這可能有所幫助:http://wiki.lwjgl.org/wiki/Using_High_DPI_Mode – Amadeus

+0

我認爲@JWWalker是對的!在您提到它之後,我在GLFW文檔中發現了這一點:注意不要將窗口大小傳遞給glViewport或其他基於像素的OpenGL調用。窗口大小在屏幕座標中,而不是像素。對於基於像素的調用,使用像素大小的framebuffer大小。 – CaseyB

回答

2

讀取幀緩衝區的大小是這裏的答案。我用用戶傳入的像素大小創建窗口,然後讀取frameBuffer大小以傳遞給glViewport。

public Window(String title, int width, int height) 
{ 
    _errorCallback = GLFWErrorCallback.createPrint(System.err); 
    GLFW.glfwSetErrorCallback(_errorCallback); 

    if (GLFW.glfwInit() != GLFW.GLFW_TRUE) 
    { 
     throw IllegalStateException("Unable to initialize GLFW"); 
    } 

    GLFW.glfwDefaultWindowHints(); 
    GLFW.glfwWindowHint(GLFW.GLFW_VISIBLE, GLFW.GLFW_FALSE); 
    GLFW.glfwWindowHint(GLFW.GLFW_RESIZABLE, GLFW.GLFW_TRUE); 

    _window = GLFW.glfwCreateWindow(width, height, title ?: "", 0, 0); 
    if (_window == 0L) 
    { 
     throw RuntimeException("Failed to create window"); 
    } 

    // Setup Callbacks 

    // Get the resolution of the primary monitor 
    GLFWVidMode vidmode = GLFW.glfwGetVideoMode(GLFW.glfwGetPrimaryMonitor()); 

    // Center our window 
    GLFW.glfwSetWindowPos(_window, (vidmode.width() - width)/2, (vidmode.height() - height)/2); 

    // Make the OpenGL context current 
    GLFW.glfwMakeContextCurrent(_window); 

    // Enable v-sync 
    GLFW.glfwSwapInterval(1); 

    // Make the window visible 
    GLFW.glfwShowWindow(_window); 
} 

然後我讀取幀緩衝區大小傳遞到glViewport和glFrustum。

public Vector2 frameBufferSize() 
{ 
    IntBuffer bufferWidth = BufferUtils.createIntBuffer(4); 
    IntBuffer bufferHeight = BufferUtils.createIntBuffer(4); 

    GLFW.glfwGetFramebufferSize(_window, bufferWidth, bufferHeight); 

    return Vector2(bufferWidth.get(0), bufferHeight.get(0)); 
} 
相關問題