2017-06-17 52 views
0

我试图用OpenGL使用Pyglet呈现图像。到目前为止,我已经能够设置framebuffer和纹理,渲染并保存为PNG图像。但我无法找到如何使用Pyglets字体渲染。Pyglet将文本绘制成纹理

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) 

该文本不会出现在帧缓冲区。我怎样才能渲染framebuffer上的标签?

回答

1

对于在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,

foo.png (output framebuffer image)

+0

感谢的作品!只需将'0,height'参数切换到'glOrtho()'垂直翻转图像即可。 :) –

+0

整洁!或者,我认为在倾倒帧缓冲之后你会翻转图像。像''data' np.flipud(data)''在'glReadPixels()'之后。 – Jay