Modyfikacja pikseli tekstury z formatem obsługującym przezroczystość w sdl2

0

Mam taki problem, chce pozmieniać w swoim programie, niektóre piksele załadowanego obrazka *.png na przezroczyste, po załadowaniu obrazka do programu.
znalazłem jakieś rozwiązanie na https://itproblemy.pl/questions/18556623/sdl2-messed-up-image-with-manipulating-pixels-and-sdlupdatetexture>
i to nie działa tak to zrobiłem na postawie tego co znalazłem:```

SDL_Texture* loadGleba( string path )
{
	void* pixels = NULL;
	int pitch = 0;
	SDL_Texture* newTexture = NULL;
	SDL_Surface* loadedSurface = IMG_Load( path.c_str() );
	SDL_Surface* imageFomatted = SDL_ConvertSurfaceFormat(loadedSurface, 
                                                      SDL_PIXELFORMAT_RGBA8888, 
                                                      NULL);
	if( loadedSurface == NULL )
	{
		cout<<"nie mozna zaladowac obrazka: "<<path.c_str()<<"! blad:"<<IMG_GetError()<<endl;
	}
	newTexture = SDL_CreateTexture(gRenderer,
                            	SDL_PIXELFORMAT_RGBA8888,
                            	SDL_TEXTUREACCESS_STREAMING,
                            	imageFomatted->w, imageFomatted->h);
        SDL_LockTexture(newTexture, &imageFomatted->clip_rect, &pixels, &pitch);
        memcpy(pixels, imageFomatted->pixels, (imageFomatted->pitch * imageFomatted->h));

	int width   = imageFomatted->w;
	int height  = imageFomatted->h; 
	punkt(width,height).pisz();
	Uint32* pixels32    = (Uint32*)pixels;
	int     pixelCount  = (pitch / 4) * height; 
	Uint32 transparent  = SDL_MapRGBA(imageFomatted->format, 0x80, 0x80, 0x80, 0x00); 
	for (int i = 5000; i < pixelCount-5000; i++) 
		pixels32[i]=transparent;// tu chce przezroczysty mieć pisel 
	SDL_UnlockTexture(newTexture);

	SDL_FreeSurface(imageFomatted);
	SDL_FreeSurface(loadedSurface);
	return newTexture;
}```

i tam gdzie ustawiam przezroczyste wychodzi białe. Myślę że problem jest związany z formatami ale nie wiem gdzie.
z góry dziękuje za pomoc

0

Chyba rzeczywiście zrobiłem niewystarczająco dokładny research. Już wiem co trzeba zrobić trzeba przed return dodać:
SDL_SetTextureBlendMode(newTexture, SDL_BLENDMODE_BLEND);
Choć nie do końca wiem czemu. Ostatnio mam dużo na głowie i nie mam czasu się wgłębiać.

0
    Uint32* pixels32    = (Uint32*)pixels;
    int     pixelCount  = (pitch / 4) * height; 
    Uint32 transparent  = SDL_MapRGBA(imageFomatted->format, 0x80, 0x80, 0x80, 0x00); 
    for (int i = 5000; i < pixelCount-5000; i++) 
        pixels32[i]=transparent;// tu chce przezroczysty mieć pisel 

To nie jest prawidłowe, bo nie bierzesz pod uwagę pitch. To znaczy bierzesz do liczenia pixelCount, co nie ma sensu bo pikseli jest oczywiście width*height, a potem traktujesz pixels32 jako ciągły obszar pikseli, bez uwzględnienia “pitch”.

0

Czy to znaczy że piksel nie jest w pixels32[y*szerokość + x] bez mnożenia przez 4 bo pixels32 wskazuje na typ 4 bajtowy?

1 użytkowników online, w tym zalogowanych: 0, gości: 1