Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pisze kod łączący allegro 5 i open GL, ale mam problem z teksturowaniem.

Ostatnio zmodyfikowano 2025-04-29 17:47
Autor Wiadomość
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
C/C++
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.
P-182299
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:

C/C++
void Texture::Load( ALLEGRO_BITMAP * bitmap )
{
   
if( !bitmap )
   
{
       
std::cerr << "Nie udało się załadować bitmapy!\n";
       
return; // <-- bardzo ważne!
   
}
   
   
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; // <-- bardzo ważne!
   
}
   
   
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);)?
P-182300
« 1 »
  Strona 1 z 1