gpt4 book ai didi

python - 在 python 中没有可见窗口的 OpenGL 渲染 View

转载 作者:太空狗 更新时间:2023-10-29 21:48:18 24 4
gpt4 key购买 nike

我需要渲染一些场景。我设法使用 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()

最佳答案

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

无法创建 OpenGL Context 1.0以上版本无窗口。
查看问题的答案 Creating OpenGL context without window .

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

遗憾的是,无法使用 Pygame 创建一个最初隐藏的窗口。 .
只有在 pygame.display.iconify() 创建窗口后才能隐藏窗口.另见 Hiding pygame display .

但是可以使用 GLFW 创建一个最初隐藏的窗口通过设置 window hintVISIBLEFalse

glfw 库可以在 glfw 1.7.0 找到.

代码可能是这样的:

import cv2
import numpy as np
from OpenGL.GL import *
from OpenGL.GLU import *
import glfw

def main():
DISPLAY_WIDTH = 900
DISPLAY_HEIGHT = 900

# Initialize the library
if not glfw.init():
return
# Set window hint NOT visible
glfw.window_hint(glfw.VISIBLE, False)
# Create a windowed mode window and its OpenGL context
window = glfw.create_window(DISPLAY_WIDTH, DISPLAY_HEIGHT, "hidden window", None, None)
if not window:
glfw.terminate()
return

# Make the window's context current
glfw.make_context_current(window)

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)

glfw.destroy_window(window)
glfw.terminate()

if __name__ == "__main__":
main()

关于python - 在 python 中没有可见窗口的 OpenGL 渲染 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51627603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com