Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyglet将文本绘制到纹理中_Python_Opengl_Pyglet_Text Rendering - Fatal编程技术网

Python Pyglet将文本绘制到纹理中

Python Pyglet将文本绘制到纹理中,python,opengl,pyglet,text-rendering,Python,Opengl,Pyglet,Text Rendering,我正在尝试使用Pyglet使用OpenGL渲染图像。到目前为止,我已经能够设置帧缓冲区和纹理,渲染到其中并将其保存为PNG图像。但我不知道如何使用Pyglets字体渲染 import numpy as np import pyglet from pyglet.gl import * from ctypes import byref, sizeof, POINTER width = 800 height = 600 cpp = 4 # Create the framebuffer (rende

我正在尝试使用Pyglet使用OpenGL渲染图像。到目前为止,我已经能够设置帧缓冲区和纹理,渲染到其中并将其保存为PNG图像。但我不知道如何使用Pyglets字体渲染

import numpy as np
import pyglet
from pyglet.gl import *
from ctypes import byref, sizeof, POINTER

width = 800
height = 600
cpp = 4

# Create the framebuffer (rendering target).
buf = gl.GLuint(0)
glGenFramebuffers(1, byref(buf))
glBindFramebuffer(GL_FRAMEBUFFER, buf)

# Create the texture (internal pixel data for the framebuffer).
tex = gl.GLuint(0)
glGenTextures(1, byref(tex))
glBindTexture(GL_TEXTURE_2D, tex)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, None)

# Bind the texture to the framebuffer.
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0)

# Something may have gone wrong during the process, depending on the
# capabilities of the GPU.
res = glCheckFramebufferStatus(GL_FRAMEBUFFER)
if res != GL_FRAMEBUFFER_COMPLETE:
  raise RuntimeError('Framebuffer not completed')

glViewport(0, 0, width, height)

# DRAW BEGIN
# =====================
glClearColor(0.1, 0.1, 0.1, 1.0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 0.5, 0.02)
glRectf(-0.75, -0.75, 0.75, 0.75)

glColor3f(1.0, 1.0, 1.0)
label = pyglet.text.Label(
  "Hello, World", font_name='Times New Roman', font_size=36,
  x=0, y=0, anchor_x='center', anchor_y='center')
label.draw()
# =====================
# DRAW END

# Read the buffer contents into a numpy array.
data = np.empty((height, width, cpp), dtype=np.float32)
glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, data.ctypes.data_as(POINTER(GLfloat)))

# Save the image.
import imageio
data = np.uint8(data * 255)
imageio.imwrite("foo.png", data)

文本不会显示在帧缓冲区上。如何在帧缓冲区上渲染标签?

要在Pyglet中渲染标签,首先应设置正交投影。在给定的示例中,按以下步骤执行:

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0, width, 0, height, -1, 1)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glColor3f(1.0, 1.0, 1.0)
label = pyglet.text.Label(
  "Hello, World", font_name='Times New Roman', font_size=36,
  x=width/2, y=height/2, anchor_x='center', anchor_y='center')
label.draw()
然后,将按预期渲染标签。(注意:将标签的偏移移动到图像中心,即
x=width/2,y=height/2,


谢谢,这很有效!只需将
0,height
参数切换到
glOrtho()
即可垂直翻转图像整洁的或者,我认为您会在转储帧缓冲区后翻转图像。类似于--
data=np.flipud(data)
after
glReadPixels()