I should be going back to re-read my opengl books shouldn't I? Alright
I'll do that.

Also: I don't usually spell 'vertex' like that. I need my morning
coffee.



On Nov 20, 10:21 am, Jonathan Hartley <[email protected]> wrote:
> I have made some progress figuring this out. Minimal code repro below.
>
> The text unexpectedly appears black only when I convert my Texture
> into an ImageData, by calling get_image_data() on it.
>
> I did this conversion because I add the image to a texture atlas for
> rendering speed, and when adding the original Texture, I got:
>
>   File "C:\Python26\lib\site-packages\pyglet\image\__init__.py", line
> 482, in
> blit_to_texture
>     raise ImageException('Cannot blit %r to a texture.' %
> self)
> pyglet.image.ImageException: Cannot blit <TextureRegion 12x28> to a
> texture.
>
> So, I think my only absolutely critical question is: How should I be
> adding the Textures returned from label2texture() to my texture atlas?
>
> Howevever, I clearly still have minstunderstood lots.
>
> If I remove all usage of a Texture atlas (as in the minimal repro
> below) and leave the Texture as a Texture, then the text is not
> rendered black. It is rendered exactly as the current vertex color.
> This still surprises me. Tristam, you say that the vertex color
> multiplies the texture color, which I interpret to mean:
>
>     color visible on screen = pixel color in the texture * current
> vertext color
>
> (where all these are three component rgb values, with each component
> normalised to lie within range 0.0 to 1.0, and the multiply operator
> works like this:
>
>    Rout = Rtexture * Rvert
>    Gout = Gtexture * Gvert
>    Bout = Btexture * Bvert
>
> But that isn't precisely what I'm seeing. As visible in the repro
> below, it looks like:
>
>     color visible on screen = current vertext color
>
> i.e. the drawing the label yellow (255, 255, 0), and setting the
> current pixel color to blue (0, 0, 255), I see blue text on screen.
> How does Bout get a non-zero value, if Btexture = 0?
>
> Thanks for any understanding anyone can bequeath me with.
>
>   - Jonathan aka tartley
>
> import code
> import pyglet
> from pyglet.text import Label
> 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_ALPHA)
>
>     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
>
> class Render(object):
>
>     def create_image(self):
>         label = pyglet.text.Label(
>           text='yellow text',
>           font_name = 'Times New Roman',
>           font_size = 48,
>           bold = True,
>           x = 20,
>           y = 5,
>           color = (255, 255, 0, 255), # YELLOW
>         )
>         image = label2texture(label)
>
>         # converting the Texture to an ImageData turns the text black
>         # so don't do that
>         # but then how can we add this texture to a texture atlas?
>         # image = image.get_image_data()
>
>         image.anchor_x = image.width / 2
>         image.anchor_y = image.height / 2
>         return image
>
>     def init(self):
>         self.win = pyglet.window.Window()
>         self.win.on_draw = self.draw
>
>         glEnable(GL_BLEND)
>         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
>         glClearColor(0.9, 0.5, 0.7, 0.0)
>
>         self.image = self.create_image()
>
>         pyglet.app.run()
>
>     def draw(self):
>         glClear(GL_COLOR_BUFFER_BIT)
>         glColor3f(0.0, 0.0, 1.0) # current vertex color = blue
>
>         # image displays text in the current vertex color?
>         self.image.blit(self.win.width / 2, self.win.height / 2)
>
> if __name__ == '__main__':
>     r = Render()
>     r.init()
>
> On Nov 19, 10:54 pm, Jonathan Hartley <[email protected]> wrote:
>
> > The texture's transparent pixels (around the text) come out as the
> > screen background color, they are perfect.
> > The problem is with the pixels which make up the text - they are
> > black, I expected the text baked into the texture to be the same color
> > that I created the text Label as.
>
> > I just got home, I'll do more tests now... ta!
>
> > On Nov 19, 10:16 pm, Tristam MacDonald <[email protected]> wrote:
>
> > > On Thu, Nov 19, 2009 at 4:58 PM, Jonathan Hartley 
> > > <[email protected]>wrote:
>
> > > > Ahar! Thanks - so it does. Thanks very much for the pointer.
>
> > > > I shall interpret that as a clue as I look for why the text looks
> > > > black in my own application. Obviously I made sure that vertex color
> > > > is set to something non-black, but that hasn't fixed it.
>
> > > Are the pixels in your texture black (since 0*x == 0)? A common problem is
> > > that someone manages to encode an opaque, black texture in an RGBA 
> > > format...
>
> > > --
> > > Tristam MacDonaldhttp://swiftcoder.wordpress.com/

--

You received this message because you are subscribed to the Google Groups 
"pyglet-users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/pyglet-users?hl=.


Reply via email to