在python中没有可见窗口的OpenGL渲染视图

2024-03-29 06:35:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要渲染一些场景。我设法用pyopengl和pygame在python中实现了这一点。问题是它会在短时间内创建一个窗口。在

我想渲染相同的图像并保存它,而不创建一个可见的窗口(或者可能根本不创建窗口,甚至没有pygame)。在

import cv2
import numpy as np
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

def main():
    DISPLAY_WIDTH = 900
    DISPLAY_HEIGHT = 900

    pygame.init()
    pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT), DOUBLEBUF | OPENGL)
    gluPerspective(90, (DISPLAY_WIDTH / DISPLAY_HEIGHT), 0.01, 12)

    glEnable(GL_TEXTURE_2D)
    glEnable(GL_DEPTH_TEST)
    glDepthFunc(GL_LEQUAL)

    glRotatef(-90, 1, 0, 0) # Straight rotation
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glRotatef(285, 0, 0, 1) # Rotate yaw
    glTranslatef(-5, -3, -2) # Move to position

    # Draw rectangle
    glBegin(GL_QUADS)
    glColor3f(1, 0, 0)
    glVertex3f(2, 2, 0)
    glVertex3f(2, 2, 2)
    glVertex3f(2, 6, 2)
    glVertex3f(2, 6, 0)
    glEnd()

    image_buffer = glReadPixels(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, OpenGL.GL.GL_RGB, OpenGL.GL.GL_UNSIGNED_BYTE)
    image = np.frombuffer(image_buffer, dtype=np.uint8).reshape(DISPLAY_WIDTH, DISPLAY_HEIGHT, 3)

    cv2.imwrite(r"C:\temp\image.png", image)

    pygame.quit()


if __name__ == "__main__":
    main()

Tags: fromimageimportmaindisplaynpwidthcv2
1条回答
网友
1楼 · 发布于 2024-03-29 06:35:16

I want to render the same image and save it, without creating a visible window

无法在没有任何窗口的情况下创建版本高于1.0的OpenGL Context
请参阅问题Creating OpenGL context without window的答案。在

但是可以使用完全隐藏的窗口进行“屏幕外”渲染。

遗憾的是,用Pygame创建一个最初隐藏的窗口是不可能的。
只有在^{}创建了一个窗口之后才能隐藏它。 另请参见Hiding pygame display。在

但是通过将window hintVISIBLE设置为False,可以创建一个带有GLFW库的初始隐藏窗口。在

glfw库可以在glfw 1.7.0找到。在

代码可能如下所示:

^{1}$

相关问题 更多 >