Не могу посчитать пиксели больше, чем 3844x1065 - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь визуализировать в закадровом FBO сцену, которую я сделал, и если я установлю ширину / высоту выше 3844/1065, мое окончательное изображение будет ограничено этим разрешением. Я использую два монитора. Следующее изображение было получено с разрешением 4500x2160. «Активная» область - 3844x1065.

enter image description here

Вот некоторый код:

        windowWidth = 4500 
        windowHeight = 2160
        mainWindow = glfw.create_window(windowWidth, windowHeight, windowTitle, None, None)
        glfw.set_window_pos(mainWindow, 10, 10)
        glfw.make_context_current(mainWindow)
        glfw.set_window_size_callback(mainWindow, window_resize)
        frameBuffer = glGenFramebuffers(1)
        glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer)
        renderBuffer = glGenRenderbuffers(1)
        glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer)
        glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8, windowWidth, windowHeight)
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderBuffer)

        glDrawBuffer(GL_COLOR_ATTACHMENT0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        # draw all the stuff
        glReadBuffer(GL_COLOR_ATTACHMENT0)
        img_buf = glReadPixels(0, 0, windowWidth, windowHeight, GL_RGB, GL_UNSIGNED_BYTE)
        image = Image.frombytes(mode="RGB", size=(windowWidth, windowHeight), data=img_buf)
        image = image.transpose(Image.FLIP_TOP_BOTTOM)
        image.save('example.png')
        glfw.set_window_should_close(mainWindow, True)


        def window_resize(window, width, height):
            glViewport(0, 0, width, height)

НАЙТИ подсказку:

Если я сделаю:

     w,h = glfw.get_window_size(self.mainWindow)
     print(w)
     print(h)

Я получу: 3844 1065

Поэтому GLFW ограничивает мой размер окна, и буфер рисования использует только этот размер.

Как я могу установить вывод для рисования в FBO моего выбранного размера? (ex 5000x3000).

Параметры размера set_window_size_callback в вызове window_resize - это параметры из _GLFWwindowsizefun, которые равны 3844x1065

1 Ответ

3 голосов
/ 16 февраля 2020

Размер области просмотра всегда должен соответствовать размеру цели визуализации. Это не обязательно размер окна.

Перед рендерингом в буфер рендеринга необходимо установить в окне просмотра размер рендеринга:

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer)
glViewport(windowWidth, windowHeight); //Not the size of the window but of the renderbuffer

glDrawBuffer(GL_COLOR_ATTACHMENT0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

# draw all the stuff

При рендеринге в FBO Что касается окна, то вы должны настраивать параметры области просмотра всякий раз, когда вы меняете цель рендеринга:

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer)
glViewport(fboWidth, fboHeight);

# Render to FBO

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(windowWidth, windowHeight);

# Render to Window
...