Pisze kod łączący allegro 5 i open GL, ale mam problem z teksturowaniem.
Ostatnio zmodyfikowano 2025-04-29 17:47
AP1994 Temat założony przez niniejszego użytkownika |
Pisze kod łączący allegro 5 i open GL, ale mam problem z teksturowaniem. » 2025-04-29 14:08:21 void Texture::Load( ALLEGRO_BITMAP * bitmap ) { if( !bitmap ) { std::cerr << "Nie udało się załadować bitmapy!\n"; } ALLEGRO_LOCKED_REGION * region = al_lock_bitmap( bitmap, ALLEGRO_PIXEL_FORMAT_ABGR_8888, ALLEGRO_LOCK_READONLY ); if( !region ) { std::cerr << "Nie udało się zablokować bitmapy!\n"; } glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, al_get_bitmap_width( bitmap ), al_get_bitmap_height( bitmap ), 0, GL_RGBA, GL_UNSIGNED_BYTE, region->data ); al_unlock_bitmap( bitmap ); }
Coś w tym kodzie powoduje, że program po skompilowaniu i uruchomieniu natychmiast się wyłącza. |
|
tBane |
» 2025-04-29 17:45:09 ChatGPT wygenerował coś takiego. Może to pomoże.. ChatGPT:Tak, widzę kilka potencjalnych problemów w Twoim kodzie, które mogą powodować natychmiastowe zamknięcie programu: =Brak return po błędzie bitmapy lub blokowania bitmapy Jeśli bitmap jest nullptr albo region jest nullptr, to Ty tylko wypisujesz błąd na std::cerr, ale mimo to program dalej próbuje wykonać glTexImage2D, co oznacza, że region (czyli region->data) może być nieprawidłowy. To skutkuje segfaultem (błąd dostępu do pamięci), co natychmiast wyłącza program. =Brak sprawdzenia, czy glTexImage2D nie zgłasza błędu OpenGL może zwrócić błędy, jeśli tekstura nie jest prawidłowo skonfigurowana (np. jeśli nie masz aktywnego glBindTexture przed glTexImage2D). Jak to naprawić? Dodaj return po błędzie bitmapy albo blokowania bitmapy: void Texture::Load( ALLEGRO_BITMAP * bitmap ) { if( !bitmap ) { std::cerr << "Nie udało się załadować bitmapy!\n"; return; } ALLEGRO_LOCKED_REGION * region = al_lock_bitmap( bitmap, ALLEGRO_PIXEL_FORMAT_ABGR_8888, ALLEGRO_LOCK_READONLY ); if( !region ) { std::cerr << "Nie udało się zablokować bitmapy!\n"; return; } glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, al_get_bitmap_width( bitmap ), al_get_bitmap_height( bitmap ), 0, GL_RGBA, GL_UNSIGNED_BYTE, region->data ); al_unlock_bitmap( bitmap ); }
Dodatkowo: upewnij się przed glTexImage2D: =Czy masz już aktywną teksturę (glBindTexture(GL_TEXTURE_2D, textureID);)? =Czy masz aktywny kontekst OpenGL (czyli Allegro inicjalizuje OpenGL)? =Czy włączyłeś odpowiednie opcje (glEnable(GL_TEXTURE_2D);)? |
|
« 1 » |