OpenGL 渲染仅限于屏幕的左下四分之一

问题描述 投票:0回答:2

所以我正在用 C++ 开发一个 OpenGL 项目,我遇到了一个奇怪的问题,在创建 GLFWwindow 并绘制到它之后,我绘制的区域仅包含屏幕的左下四分之一。例如,如果屏幕尺寸为 640x480,并且我在 (600, 440) 处绘制了一个 40x40 的正方形,它会显示在此处,而不是像我期望的那样显示在右上角:enter image description here

如果我将方块移动到不在 640x480 参数范围内的区域,它就会被切断,如下所示:

enter image description here

我将在下面发布 main.cpp 中的代码:

#define FRAME_CAP 5000.0;

#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include "InputHandler.h"
#include "Game.h"
using namespace std;

void gameLoop(GLFWwindow *window){
    InputHandler input = InputHandler(window);

    Game game = Game(input);

    //double frameTime = 1.0 / FRAME_CAP;

    while(!glfwWindowShouldClose(window)){
        GLint windowWidth, windowHeight;
        glfwGetWindowSize(window, &windowWidth, &windowHeight);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0.0, windowWidth, 0.0, windowHeight, -1.0, 1.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glViewport(0, 0, windowWidth, windowHeight);

        game.render();
        game.handleInput();
        game.update();

        glfwSwapBuffers(window);
        glfwPollEvents();

    }

}

int main(int argc, const char * argv[]){
    GLFWwindow *window;

    if(!glfwInit()){
        return -1;
    }

    window = glfwCreateWindow(640.0, 480.0, "OpenGL Base Project", NULL, NULL);

    if(!window){
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glewInit();

    glfwMakeContextCurrent(window);

    gameLoop(window);

    glfwTerminate();
    exit(EXIT_SUCCESS);
}

我不确定为什么会发生这种情况,但如果您有任何想法请告诉我,谢谢!

c++ opengl glfw
2个回答
5
投票

对于像我一样遇到这个问题的人,您需要将帧缓冲区大小传递给 glViewport 调用,如下所示:

GLFWwindow * window = Application::getInstance().currentWindow;
glfwGetFramebufferSize(window, &frameBufferWidth, &frameBufferHeight);
glViewport(0, 0, frameBufferWidth, frameBufferHeight);

在某些设备(主要是 Apple Retina 显示器)中,像素尺寸不一定与您的视口尺寸 1:1 匹配。请在此处查看 GLFW 文档。


0
投票

虽然 Rafael 的答案有效,但您可以采取的另一种方法就是关闭 Retina 显示器上的全分辨率帧缓冲区:

glfwWindowHint(GLFW_COCOA_RETINA_FRAMEBUFFER, GLFW_FALSE);

(参考:拉斐尔链接的同一文档)

© www.soinside.com 2019 - 2024. All rights reserved.