I'm slowly getting it. Sorry for all the traffic. I just understood the significance of creating the texture above using the GL_ALPHA flag. The texture I am creating only has an alpha channel - no RGB. That explains the behaviour I'm seeing perfectly.
So my only outstanding question is, how do I get the texture regions generated by label2texture into my application's texture atlas? I thought that an atlas must copy the textures it is given into its own internal texture, so I don't get why it cares about the type of the image which is added. I'm only using this atlas because, up until now, everything visible in my application (background, sprites, hud images, etc,) has gone into the atlas, to be rendered with a single batch.draw(). So I figured I'd stick with that pattern if I could. On Nov 20, 10:23 am, Jonathan Hartley <[email protected]> wrote: > 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=.
