2017-06-17 4 views
0

私はPygletを使用してOpenGLで画像をレンダリングしようとしています。これまでは、フレームバッファとテクスチャを設定してレンダリングし、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) 

テキストがフレームバッファに表示されません。フレームバッファにラベルをどのようにレンダリングできますか?

答えて

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

ニート!または、フレームバッファをダンプした後にイメージを反転すると思った。 'glReadPixels()'の後に 'data = np.flipud(data)'のようなものがあります。 – Jay

関連する問題