Please look at my code example. There is no math to do. I have two images the same size (50 x 50). Each image has a shape with A=255. The rest of the image A = 0.
I want to draw one image on the other. So I convert one image into a texture and blit_into with the other image. I should be able to see through the transparent parts of the top image and see the opaque parts of the bottom image. But I can't. It won't work. On Thursday, March 12, 2020 at 12:30:32 PM UTC-4, Charles M wrote: > > Blend modes themselves aren't going to help you with combining textures > into one. That's only for things like sprites and other things in the > framebuffer. > > It's not OpenGL at this point, it's the data you are providing it. You > need to use math to change your pixel data with the blend mode formula > equation in the link I provided in the last post. > > On Thursday, March 12, 2020 at 11:04:21 AM UTC-5, Jonathon Parker wrote: >> >> I need them as one image. I have tried many different blend function >> things and if they don't throw an error they all do the same things. >> Namely, only display rect. >> >> Something has to be wrong somewhere else. I tried >> pyglet.gl.glBlendFunc(pyglet.gl.GL_ZERO,pyglet.gl.GL_ONE) >> >> If I understand it right, it should only display the destination image >> (the triangle) and set the source image to have a zero factor. But that is >> not what it does. It still displays the thin rectangle. >> >> On Thursday, March 12, 2020 at 10:53:58 AM UTC-4, Charles M wrote: >>> >>> Ah I see you want to blend them together in the same data. In your >>> examples you are still overwriting the image data. If you have a red >>> channel that's at 100 bytes and you replace the data with another pixel >>> that's 100 bytes, it's still 100. If you are looking to blend two images >>> together you have a few options: >>> >>> 1) Create separate ImageData, put them into pyglet.sprite.Sprite objects >>> and draw them where you want. By default Sprites should blend, and it >>> should be easier to keep track of things/move them when they are separate. >>> I'm curious why the need to combine the data instead of treating them >>> separate but move them where you want? >>> >>> 2) If you actually *need *them combined into one image data for some >>> reason, then you can combine the pixels together with math based on >>> blending formulas. https://learnopengl.com/Advanced-OpenGL/Blending Here >>> is the formula and an example. >>> >>> >>> On Thursday, March 12, 2020 at 7:49:36 AM UTC-5, Jonathon Parker wrote: >>>> >>>> I tried that and it did not work. I have verified that if I draw a >>>> smaller image on top of the new, I can see that. But even with using >>>> RGBA, >>>> I only see the last image if the sizes are the same. Here is a more >>>> expanded example of what I am trying to do. >>>> >>>> --- >>>> >>>> import pyglet >>>> import pyglet.gl >>>> import ctypes >>>> import itertools >>>> import numpy as np >>>> import cv2 >>>> >>>> pyglet.gl.glEnable(pyglet.gl.GL_BLEND) >>>> >>>> pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA,pyglet.gl.GL_ONE_MINUS_SRC_ALPHA) >>>> >>>> image = np.zeros((50, 50, 4), np.uint8) # type(image) = numpy.ndarray >>>> >>>> pt1 = (12, 1) >>>> pt2 = (48, 24) >>>> pt3 = (12, 48) >>>> pt4 = (1, 24) >>>> pt5 = (1, 26) >>>> pt6 = (48, 26) >>>> pt7 = (48, 24) >>>> >>>> triangle_cnt = np.array([pt1, pt2, pt3]) >>>> cv2.drawContours(image, [triangle_cnt], 0, (100, 255, 100, 255), -1) >>>> image = image.tolist() >>>> px = list(itertools.chain(*list(itertools.chain(*image)))) >>>> >>>> rawData = (ctypes.c_ubyte * len(px))(*px) >>>> player_image = pyglet.image.ImageData(50, 50, 'RGBA', >>>> rawData).get_texture() >>>> >>>> image2 = np.zeros((50, 50, 4), np.uint8) >>>> rect_cnt = np.array([pt4, pt5, pt6, pt7]) >>>> cv2.drawContours(image2, [rect_cnt], 0, (100, 255, 100, 255), -1) >>>> image2 = image2.tolist() >>>> px2 = list(itertools.chain(*list(itertools.chain(*image2)))) >>>> >>>> rawData2 = (ctypes.c_ubyte * len(px2))(*px2) >>>> rect = pyglet.image.ImageData(50, 50, 'RGBA', rawData2) >>>> >>>> player_image.blit_into(rect, 0, 0, 0) >>>> >>>> --- >>>> >>>> When I display player_image, I only see the thin rectangle. What am I >>>> doing wrong? >>>> >>>> My goal is to change images for sprites during a simulation depending >>>> on simulation events. If you know a better way to accomplish this, I >>>> would >>>> like to hear it. >>>> >>>> On Wednesday, March 11, 2020 at 7:49:46 PM UTC-4, Charles M wrote: >>>>> >>>>> Your images have no transparency (RGB). You need will need to specify >>>>> an alpha channel to do transparency: RGBA and a fourth value for each >>>>> pixel. >>>>> >>>>> >>>>> On Wednesday, March 11, 2020 at 5:57:27 PM UTC-5, Jonathon Parker >>>>> wrote: >>>>>> >>>>>> In my test the images are the same size, but I thought the background >>>>>> was transparent. Any way to specify a background color is transparent? >>>>>> Or >>>>>> is there a better way to layer images? >>>>>> >>>>>> On Wednesday, March 11, 2020 at 6:44:00 PM UTC-4, Charles M wrote: >>>>>>> >>>>>>> This is normal behavior, blit overwrites the pixel data with new >>>>>>> data you are providing. Which in this case is an entirely new image. >>>>>>> >>>>>>> On Wednesday, March 11, 2020 at 2:34:15 PM UTC-5, Jonathon Parker >>>>>>> wrote: >>>>>>>> >>>>>>>> A minimal example >>>>>>>> >>>>>>>> # rawdata1 and rawdata2 are a list of c_ubytes >>>>>>>> >>>>>>>> my_texture_region = pyglet.image.ImageData(x, y, 'RGB', >>>>>>>> rawdata1).get_texture() >>>>>>>> my_image = pyglet.image.ImageData(x, y, 'RGB', rawdata2) >>>>>>>> my_texture_region.blit_into(my_image, 0, 0, 0) >>>>>>>> >>>>>>>> When I create a sprite using my_texture region, I only see >>>>>>>> my_image. What I want is my_image on top of my_texture_region. >>>>>>>> >>>>>>>> What am I doing wrong? >>>>>>>> >>>>>>>> >>>>>>>> -- You received this message because you are subscribed to the Google Groups "pyglet-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to pyglet-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/pyglet-users/bac6d6cb-c2fa-4f93-860d-a25534465655%40googlegroups.com.