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/e695e7fb-e4f7-4731-aa15-d6e5117045fa%40googlegroups.com.

Reply via email to