OpenGL установить цвет текстуры с цветом вершины - PullRequest
1 голос
/ 28 октября 2008

Поскольку мне нужно отобразить огромное количество меток , которые перемещаются независимо , мне нужно визуализировать метку в pyglet для текстуры (в противном случае обновление список вершин для каждого глифа слишком медленный).

У меня есть решение для этого, но моя проблема в том, что текстура, которая содержит глифы, черная, но я бы хотел, чтобы она была красной. Смотрите пример ниже:

from pyglet.gl import *

def label2texture(label):
    vertex_list = label._vertex_lists[0].vertices[:]
    xpos = map(int, vertex_list[::8])
    ypos = map(int, vertex_list[1::8])
    glyphs = label._get_glyphs()

    xstart = xpos[0]
    xend = xpos[-1] + glyphs[-1].width
    width = xend - xstart

    ystart = min(ypos)
    yend = max(ystart+glyph.height for glyph in glyphs)
    height = yend - ystart

    texture = pyglet.image.Texture.create(width, height, pyglet.gl.GL_RGBA)

    for glyph, x, y in zip(glyphs, xpos, ypos):
        data = glyph.get_image_data()
        x = x - xstart
        y =  height - glyph.height - y + ystart
        texture.blit_into(data, x, y, 0)

    return texture.get_transform(flip_y=True)

window = pyglet.window.Window()
label = pyglet.text.Label('Hello World!', font_size = 36)
texture = label2texture(label)

@window.event
def on_draw():
    hoff = (window.width / 2) - (texture.width / 2)
    voff = (window.height / 2) - (texture.height / 2)

    glClear(GL_COLOR_BUFFER_BIT)
    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glClearColor(0.0, 1.0, 0.0, 1.0)
    window.clear()
    glEnable(GL_TEXTURE_2D);

    glBindTexture(GL_TEXTURE_2D, texture.id)
    glColor4f(1.0, 0.0, 0.0, 1.0) #I'd like the font to be red
    glBegin(GL_QUADS);
    glTexCoord2d(0.0,1.0); glVertex2d(hoff,voff);
    glTexCoord2d(1.0,1.0); glVertex2d(hoff+texture.width,voff);
    glTexCoord2d(1.0,0.0); glVertex2d(hoff+texture.width,voff+texture.height);
    glTexCoord2d(0.0,0.0); glVertex2d(hoff, voff+texture.height);
    glEnd();

pyglet.app.run()

Есть идеи, как мне это покрасить?

Ответы [ 2 ]

2 голосов
/ 02 января 2009

Вы хотите установить glEnable(GL_COLOR_MATERIAL). Это смешивает цвет текстуры с текущим цветом OpenGL. Вы также можете использовать функцию glColorMaterial, чтобы указать, должны ли быть затронуты передние / задние / оба полигона. Документы здесь .

0 голосов
/ 29 октября 2008

Разве это не при использовании декалирования через <a href="http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/texenv.html" rel="nofollow noreferrer">glTexEnv()</a>?

...