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-06-03 21:18
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
AP1994
Temat założony przez niniejszego użytkownika
» 2025-05-09 19:33:42
co za różnica czy napisze return czy nie to i tak nie działa
mój cały kod
C/C++
Texture::Texture()
{
   
glGenTextures( 1, & myTexture );
   
glBindTexture( GL_TEXTURE_2D, myTexture );
   
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
   
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
   
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
   
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
}
void Texture::Load( ALLEGRO_BITMAP * bitmap )
{
   
if( !bitmap )
   
{
       
std::cerr << "Nie udało się załadować bitmapy!\n";
       
al_rest( 5 );
       
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";
       
al_rest( 5 );
       
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 );
}
nie dostaje żadnego komunikatu tylko program mi się zamyka
P-182338
AP1994
Temat założony przez niniejszego użytkownika
» 2025-05-09 19:56:50
zorientowałem się że glTexImage2D powoduje błąd
P-182339
tBane
» 2025-05-09 20:22:41
Nie jestem za dobry w OpenGL ale ja bym zrobił tak:

Spróbuj przed glTexImage2D dodać
glBindTexture( GL_TEXTURE_2D, myTexture );


I jeszcze masz rozbieżne formaty pikseli.
C/C++
ALLEGRO_LOCKED_REGION * region = al_lock_bitmap( bitmap, ALLEGRO_PIXEL_FORMAT_ABGR_8888, ALLEGRO_LOCK_READONLY );
// ...
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 );

Zmień
ALLEGRO_PIXEL_FORMAT_ABGR_8888


na
ALLEGRO_PIXEL_FORMAT_RGBA_8888
P-182340
termistor
» 2025-06-03 21:18:30
Witam, AP1994. Na podstawie opisu i kodu można wskazać kilka kluczowych aspektów, które mogą powodować awarię programu. Oto szczegółowe analiza i propozycje rozwiązań:

---

### 1. **Brak ponownego wiązania tekstury w metodzie `Load`**
Chociaż konstruktor klasy `Texture` wiąże teksturę (`glBindTexture`), w metodzie `Load` po prostu wywołuje się `glTexImage2D` bez ponownego wiązania tej samej tekstury. W OpenGL aktywna tekstura jest określana przez ostatnie wywołanie `glBindTexture`. Jeśli przed `glTexImage2D` nie jest aktywny żaden obiekt tekstury (lub inny obiekt), może to prowadzić do błędnego działania lub awarii.

**Rozwiązanie**: Dodaj ponowne wiązanie tekstury przed `glTexImage2D`:

void Texture::Load(ALLEGRO_BITMAP* bitmap)
{
    if (!bitmap)
    {
        std::cerr << "Nie udało się załadować bitmapy!\n";
        al_rest(5);
        return;
    }

    ALLEGRO_LOCKED_REGION* region = al_lock_bitmap(bitmap, ALLEGRO_PIXEL_FORMAT_RGBA_8888, ALLEGRO_LOCK_READONLY);
    if (!region)
    {
        std::cerr << "Nie udało się zablokować bitmapy!\n";
        al_rest(5);
        return;
    }

    glBindTexture(GL_TEXTURE_2D, myTexture); // <<== KLUCZOWE
    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);
}

---

### 2. **Mieszanie formatów pikseli (ABGR vs. RGBA)**
W kodzie używasz `ALLEGRO_PIXEL_FORMAT_ABGR_8888` do blokowania bitmapy, ale OpenGL oczekuje `GL_RGBA` (czyli kolejność kanałów RGBA). To może prowadzić do nieprawidłowego odczytu danych pikseli przez OpenGL, co w skrajnych przypadkach może spowodować awarię.

**Rozwiązanie**: Użyj `ALLEGRO_PIXEL_FORMAT_RGBA_8888` zgodnie z formatem oczekiwanym przez OpenGL:

ALLEGRO_LOCKED_REGION* region = al_lock_bitmap(bitmap, ALLEGRO_PIXEL_FORMAT_RGBA_8888, ALLEGRO_LOCK_READONLY);

---

### 3. **Brak sprawdzenia błędów OpenGL**
Jeśli `glTexImage2D` kończy się niepowodzeniem, nie generuje komunikatu o błędzie, ale może spowodować awarię (np. segfault). Należy dodać sprawdzenie błędów OpenGL po jego wywołaniu:

GLenum error = glGetError();
if (error != GL_NO_ERROR)
{
    std::cerr << "Błąd OpenGL: " << error << std::endl;
    exit(EXIT_FAILURE);
}

---

### 4. **Brak aktywnego kontekstu OpenGL**
Upewnij się, że kontekst OpenGL został poprawnie utworzony przez Allegro. Na przykład:

al_init();
al_install_system(0, 0);
al_init_image_addon();
al_set_new_display_opengl(true);
ALLEGRO_DISPLAY* display = al_create_display(800, 600);

---

### 5. **Dostępność bitmapy i danych**
Sprawdź, czy `bitmap` nie jest `nullptr` przed wywołaniem `al_lock_bitmap`. Dodatkowo, upewnij się, że `region->data` nie jest `nullptr`:

if (!region || !region->data)
{
    std::cerr << "Brak danych bitmapy!" << std::endl;
    return;
}

---

### Podsumowanie
1. Dodaj ponowne `glBindTexture` przed `glTexImage2D`.
2. Użyj `ALLEGRO_PIXEL_FORMAT_RGBA_8888` zgodnie z formatem OpenGL.
3. Sprawdzaj błędy OpenGL po wywołaniach.
4. Upewnij się, że kontekst OpenGL jest aktywny.
5. Weryfikuj poprawność danych bitmapy i regionu.

Jeśli problem się utrzymuje, sugeruję dodanie debugowania:

std::cerr << "Rozmiar bitmapy: " << al_get_bitmap_width(bitmap) << "x" << al_get_bitmap_height(bitmap) << std::endl;
std::cerr << "Dane bitmapy: " << (void*)region->data << std::endl;

Pozdrawiam,  
termistor
P-182443
« 1 »
  Strona 1 z 1