Skocz do zawartości

[Freepascal][OpenGL & JEDI-SDL] Tekstura a to co widzimy


Nvm

Polecane posty

Witam wszystkich. Otóż, jakiś czas temu rozpoczęłem naukę OpenGL. Mniej więcej większość rzeczy rozumiem. Napotkałem jednak na dziwny (jak dla mnie) problem. Otóż wczytuję teksturę w formacie *.bmp niebiańsko zatytułowaną "kamien3.bmp" przedstawiającą narysowany przeze mnie kamień. Tak wiem, nie jest on zbyt ładny jednak przyjmijmy, że jest w porządku gdyż bibliotece OpenGL się on podoba i wszystko wyświetla się prawidłowo. Okay, ponieważ kamień nie był zbyt ładny i nie miał zbyt wysokiej rozdzielczości postanowiłem go podmienić na coś innego - mianowicie moje "logo", jeśli zgodzicie się to tak nazwać. Miało ono rozmiary 256x256 i nie wyświetlało się poprawnie. Nie pamiętam jednak co wyglądało nie tak. Pomyślałem więc, że jest to wina wielkości bitmapy, ponieważ nasz "kamien3.bmp" miał 64x64 piksele. Tak więc za pomocą moich zdolnych palców jak i mocy obliczeniowej mojego procesora udało mi się pomniejszyć logo do rozmiarów 64x64. Cały zadowolony z sytuacji, byłem pewien, że wszystko się uda. Bzdura. Dla zobrazowania sytuacji przedstawiam dwa screeny przedstawiające efekt działania 2 różnych tekstur, oraz obydwie tekstury. Obydwie bitmapy są 24-bitowe, przynajmniej według zeznań niewątpliwie profesjonalnego narzędzia jakim jest Microsoft Paint (wybaczcie mi sarkazm, teraz na informatyce rysujemy godła w tym programie i 15 sekund bez wytknięcie wady owego programu graniczy z cudem ;)), ale może wy dopatrzycie się jakiegoś błędu... W kodzie zmieniam tylko adres pliku tekstury! Przedstawiam kod procedury odpowiadającej za wczytanie bitmapy, oraz kod procedury odpowiedzialnej za wyrysowanie całej sceny:

 

procedure LoadTextures;
var
  TextureFile : PSDL_Surface;
begin
 //Wczytaj bitmape
 TextureFile := SDL_LoadBMP('Data/Textures/kamien3.bmp');
 //Storz teksture
 glGenTextures(1, @Texture);
 //Generowanie tekstury z bitmapy
 glBindTexture(GL_Texture_2D, Texture);
 //Wygeneruj teksture
 glTexImage2D(GL_Texture_2D, 0, 3, TextureFile^.W, TextureFile^.H, 0, GL_BGR, GL_Unsigned_Byte, TextureFile^.Pixels);

 //Filtrowanie liniowe
 //Skaluj linowo gdy obrazek jest wiekszy niz tekstura
 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
 //Skaluj liniowo gdy obrazek jest mniejszy niz tekstura
 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

 //Zwolnij powierzchnie bitmapy
 SDL_FreeSurface(TextureFile);
end;
Ś)1M)(ź]ą(ą
ą1}
=1=I}   UI}  %P1}AQ!} UI}  %P(źAŃŹ(ą1%ŃŃ((źAąźą(źMĄąźą(ąQąŃ(źź9IeMU(QI=)-P(źiIąŃ(ą    1}A=1e=8(ąYŃźĄąŹ(ą
ąź-ąźĄą(ąYŃźąĄąŹ(ą
ąź-ąąźźĄą(ąYŃźąąĄąŹ(ą
ąź-ąąźąźĄą(ąźiŃŃ((ąQąŃ((ź=ŃŃ(ą     QŃĄ1}QaQUI|QŃ(ź=(źąIŃŃĄIŃŃ(źź9IeMU(
i]=I=-P(ą Ą1}EUL(ąQ
ąYŃ(ąQ
ąYŃ(ąQ
ąYŃ(ąQ
ąYŃ(ą((źIŃѹѥIŃŃIŃŃŹą(źIŃŃŃĄIŃŃ(źAą(M1}1}M  ()(

 

Być może dla Was - starych wyjadaczy OpenGL (pozdrowienia Spider100 ;)) to problem błachy i kompletnie podstawowy. Oczywiście mogę ominąć ten problem i używać tekstury z kamieniem w roli głównej - to jednak mija się z celem. W końcu ja chcę się przede wszystkim kształcić - dopiero później tworzyć jakieś aplikacje, tudzież gry. Za wszelkie odpowiedzi z góry dziękuję i pozdrawiam.

 

 

Screeny i pliki tekstur

Link do komentarza
Udostępnij na innych stronach

Chyba jednak nie znika tylko zmienia kolor (trójkąt) dzieje się (wg. mnie tak) ponieważ przy renderowaniu trójkąta podajesz kolor na jakiś tam następnie bindujesz na teksturę (początkowo kamienia) renderujesz quad. Masz zbindowaną aktualnei teksturę z białymi pixelami(chyba tak to jest uwzględniane) przy 2 obejściu pętli renderującej kolor podanny do trójkąta zostaje przemnożony? przez teksturę (1,1,1) i wychodzi kolor jaki podałeś. Jednak jak zmieniasz na teksturę loga, która ma czarne piksele to wtedy mnoży on przez (0,0,0) i kolor trójkąta zmienia się na 0,0,0 bo nie podajesz w nim coordów jak byś podał to byś ujrzał na nim teksturę również a takto kolory zostają wymnożone i cyk.

 

Dla testu zmień kolor, którym jest zapełniany bufor na inny od czarnego i wyrenderowany zostanie Ci czarny trójkąt a nie jak wg. Ciebie nie będzie trójkąta.

 

Edit: W praktycę muszę sprawdzić czy tak rzeczywiście jest ale chyba tak mi się wydaje.

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

5corpio - miałeś rację ;) Dodałem linijkę glBindTexture(GL_TEXTURE_2D, 0); po wyrysowaniu obiektu i już jest okay. Jednak na forum GameDev.pl wyczytałem, że powinno się to robić za pomocą glEnable i glDisable, a nie w taki sposób jak ja to zrobiłem. Ale przecież glEnable przyjmuje tylko jedną wartość, więc nie za bardzo wiem o co chodzi. Mógłby ktoś objaśnić? Anyway - dzięki jeszcze raz.

 

 

lol! nastepnym razem pisz konkretnie o co chodzi a nie wypisuj jakies opowiadanie ktorego az sie nie chce czytac.

 

Na to nie licz ^_^ Będę pisał opowiadanie z najbardziej błahej sprawy jaka przyjdzie mi do łba ^_^

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...