Warsztat » Forum

[OpenGL] 2D w OpenGL

Sep 3, 2008 | cineknt |
28 wypowiedzi na 2 stronach:
1 2
cineknt
Sep 3, 2008

2D w OpenGL

Witam. Zastanawia mnie pare rzeczy...

Czytałem tu na forum troche, ze duza część osób uzywa OpenGL'a do tworzenia gier 2D ze wzgledu na rotacje itp., bo w DirectDraw z tym jest ciezko. Ja napisalem dwie gierki w DirectDraw i zaczelem uczyc sie troche Directx3D, ale problemy techniczne z Directxem ostudziły moje zapały. Dzis zaczełem czytac kursy o OpenGL i musze przyznac ze wydaje sie o wiele łatwiejsze od D3D.

Pytanie dotyczy grafiki 2D. Planowalem zrobic małą gierke 2D na multiplayera, na początku chcialem zrobic w DD, ale postanowilem sprawdzic jakie mozliwosci daje OpenGL (przez te wlasnie posty na forum popierające OpenGL : P  ).
Konkretnie: do wyswietlenia bitmap są w OpenGL jakies specjalnie funkcje (jak w DD), czy poprostu tworzy sie czworokąt i na niego kładzie texture (tak przypuszczam, bo wtedy jesli mozliwosc rotacji itp.).
Jesli to drugie, to czy jest cos takiego jak wykluczenie wybranego koloru (nie pamietam jak to sie dokladnie nazywalo, chodzi o to ze w DD mialem bitmapki z różowym tłem i obrazek zostawał naniesiony na ekran bez różowego tła).

No i chyba ostatnie pytanie, czy w OpenGL mozna wyswietlic w prosty sposób text ? (bez wczytywania bitmapek z literkami, tak jak to  jeszcze w DD robiłem : P ).

To narazie by było wszystko. Z góry dziekuje za pomoc : )
Krzysiek K.
Sep 3, 2008

Odp: 2D w OpenGL

Cytat:
Konkretnie: do wyswietlenia bitmap są w OpenGL jakies specjalnie funkcje (jak w DD), czy poprostu tworzy sie czworokąt i na niego kładzie texture (tak przypuszczam, bo wtedy jesli mozliwosc rotacji itp.).

Są funkcje do wyświetlania bitmap, ale nie są zbyt szybkie. Najlepiej, jak właśnie nałożysz teksturę na czworokąt. :)

Cytat:
Jesli to drugie, to czy jest cos takiego jak wykluczenie wybranego koloru (nie pamietam jak to sie dokladnie nazywalo, chodzi o to ze w DD mialem bitmapki z różowym tłem i obrazek zostawał naniesiony na ekran bez różowego tła).

Nie ma (chociaż na upartego można to zrobić w pixel shaderach). Zamiast wybranego koloru przezroczystego stosuje się kanał alpha. :)

Cytat:
No i chyba ostatnie pytanie, czy w OpenGL mozna wyswietlic w prosty sposób text ? (bez wczytywania bitmapek z literkami, tak jak to  jeszcze w DD robiłem : P ).

OpenGL sam z siebie nie oferuje wyświetlania tekstu, ale różne biblioteki pomocnicze mogą trochę tutaj pomóc. :)


Jeżeli dopiero zaczynasz zabawę z OpenGL, proponuję zacząć od poniższego linka:
http://nehe.gamedev.net/
Antrykot
Sep 3, 2008

Odp: 2D w OpenGL

Text można wyświetlać, np przy pomocy SDL_ttf http://www.gamedev.net/community/forums/topic.asp?topic_id=284259

Bitmapy wyświetla sie teksturując quada, czy tam trójkąty

A co do przezroczystego koloru to zobacz to http://nehe.gamedev.net/lesson.asp?index=04 - masking
cineknt
Aug 31, 2008

Odp: 2D w OpenGL

Trzeba przyznac ze odpowiadacie na tym forum błyskawicznie  ;D


Wlasnie sobie właczylem GTA2 bo bylem ciekaw jak jest zbudowane (screen u góry).
Z tego co wiem te samochody to bitmapki bo mam program do wyciągania wlasnie tych bitmapek. Jednak są cienie tych samochdów w grze, jak oni to zrobili? Bo dzieki temu wyglada jakby samochód był nad ulicą (tzn - na kołach, a nie tak typowo płasko).

Jeszcze jedno mnie zastanawia, te texty wyswietlone na samej górze w rogach, wydaje mi sie ze to typowe bitmapki naklejone na ekran, mam racje? (niewydaje mi sie zeby uzywali prostokątów z naklejonymi texturami :> ).

Aaa jeszcze jedno, ten kanał alpha to nie działa czasem do całej textury? Mi chodzi tylko o wykluczenie jednego koloru.

Jeszcze raz dzieki za pomoc : )


edit: ta stronka jest niezła : P ze tak delikatnie powiem. Skompilowalem sobie 17. lekcje z literkami, nawet mozna cienie dodawac kolorowe i literki tez robic kolorowe : P nie zły szpas, widze ze przedemną sporo dubania : P szkoda tylko ze po angielsku, bo dogadac sie bym dogadał, ale moj angielski na czytanie kursów mi nie pozwoli. No nic, bede przeglądał kodzik to powinno byc dobrze.
LOR
Sep 1, 2008

Odp: 2D w OpenGL

Cytat:
Z tego co wiem te samochody to bitmapki bo mam program do wyciągania wlasnie tych bitmapek. Jednak są cienie tych samochdów w grze, jak oni to zrobili? Bo dzieki temu wyglada jakby samochód był nad ulicą (tzn - na kołach, a nie tak typowo płasko).
Po prostu najpierw jest kładziona teksturka cienia a następnie samochodu :) Teksturkę cienia możesz prerenderować, rysować w paincie, generować przy w czytywaniu gry proceduralnie, albo dynamicznie na podstawie świateł - to już zależy od efektu który chcesz osiągnąć, tutaj jest chyba przygotowany wcześniej cień który na podstawie oświetlenia "wyjeżdża" troszkę spod samochodu w najciemniejszą stronę (nie wiem czy dość jasno to wytłumaczyłem) - nie dał bym sobie ręki obciąć że właśnie tak jest :)

Cytat:
Jeszcze jedno mnie zastanawia, te texty wyswietlone na samej górze w rogach, wydaje mi sie ze to typowe bitmapki naklejone na ekran, mam racje? (niewydaje mi sie zeby uzywali prostokątów z naklejonymi texturami :> ).

Raczej właśnie ta druga opcja ;> Tak jak krzysiek napisał - jest to szybsze, a po drugie wygodniejsze :)

Cytat:
Aaa jeszcze jedno, ten kanał alpha to nie działa czasem do całej textury? Mi chodzi tylko o wykluczenie jednego koloru.

Musisz przygotowywać odpowiednio tekstury przy wczytywaniu, poczytasz o tym na nehe na pewno :)
Krzysiek K.
Sep 4, 2008

Odp: 2D w OpenGL

Cytat:
zkoda tylko ze po angielsku, bo dogadac sie bym dogadał, ale moj angielski na czytanie kursów mi nie pozwoli.

W takim razie słownik w łapę i do boju. Masz okazję się podszkolić. :)

Cytat:
Po prostu najpierw jest kładziona teksturka cienia a następnie samochodu :)

Dokładniej: najpierw rysowane są wszystkie cienie, a potem wszystkie samochody. Inaczej cienie niektórych samochodów były by rysowane na innych samochodach. :)

Cytat:
Teksturkę cienia możesz prerenderować, rysować w paincie, generować przy w czytywaniu gry proceduralnie, albo dynamicznie na podstawie świateł - to już zależy od efektu który chcesz osiągnąć, tutaj jest chyba przygotowany wcześniej cień który na podstawie oświetlenia "wyjeżdża" troszkę spod samochodu w najciemniejszą stronę (nie wiem czy dość jasno to wytłumaczyłem) - nie dał bym sobie ręki obciąć że właśnie tak jest :)

Wystarczy, że narysujesz samochód na czarno (glColor3f(0,0,0)) z pewnym przesunięciem. :)
Xion
Sep 5, 2008

Odp: 2D w OpenGL

A przesunięcie można wybrać w zależności np. od najbliższego źródła silnego światła, jak choćby ulicznej latarni :)
Regedit
Sep 7, 2008

Odp: 2D w OpenGL

Emigrując z ciemnej krainy grafiki 2D i bibliotek takich jak DirectDraw w inny (ten trzeci) wymiar trzeba zostawić za sobą pojęcie koloru kluczowego który staje się przezroczysty. Owszem, czegoś takiego da się używać (w Direct3D potrafi to nawet sama zrobić funkcja D3DXCreateTextureFromFileEx), ale w końcu i tak wszystko staje się kanałem alfa.

Kanał alfa to czwarty obok R, G, B kanał tekstury, którego wartość mówi o tym jak dany piksel jest przezroczysty.

Najlepiej przygotowywać taką teksturę w programach graficznych które przezroczystość obsługują, np. Photoshop (ale uwaga! tam jest ta lipa że przezroczystość Photoshopowa nie staje się automatycznie kanałem alfa, trzeba go jawnie utworzyć) czy GIMP-a.

Można też już w programie dobrać się do poszczególnych pikseli wczytanej do pamięci tekstury i tak je pozmieniać, żeby w miejscu w którym R, G, B mają odpowiednią wartość (czyli jest określony kolor), kanał alfa ustawić na 0, a w pozostałych na 1 (czy tam 255, zależnie jak liczymy).

Nie wszystkie formaty graficzne obsługują przezroczystość. W taką możliwość wysposażone są TGA, PNG, BMP chyba też, ale na przykład JPEG już nie.

W samym programie (niezależnie czy to DirectX czy OpenGL) kanał alfa wykorzystuje się włączając i odpowiednio konfigurując alfa-testing albo alfa-blending.
LOR
Sep 4, 2008

Odp: 2D w OpenGL

Cytat:
Wystarczy, że narysujesz samochód na czarno (glColor3f(0,0,0)) z pewnym przesunięciem. Smiley
Hmmm fakt nie pomyślałem o tym :) Żeby cień był fajny można też ustalać 4 składową w zależności od natężenia światła, im dalej od tej latarni tym alpha większa.

Cytat:
(ale uwaga! tam jest ta lipa że przezroczystość Photoshopowa nie staje się automatycznie kanałem alfa, trzeba go jawnie utworzyć)

Uwaga 2: niedawno dowiedziałem się że w Photku CS2 jest taki błąd, że źle zapisywane są pliki tga i można mieć z nimi problem i stracić sporo cennego czasu :) W photku od 7.0 w dół takiego problemu nie było :)

Cytat:
Emigrując z ciemnej krainy grafiki 2D
Ekhm, dlaczego ciemnej ? :p Twórcy 2d jednoczcie się ! :P
MoN
Sep 7, 2008

Odp: 2D w OpenGL

L0R: podejrzewam mimo wszystko ze niewiele osob ma photoshopy, bo sa strasznie drogie, w odroznieniu od chocby gimpa, ktory jest darmowy i ma podobna funkcjonalnosc.
LOR
Sep 8, 2008

Odp: 2D w OpenGL

Z wielkim smutkiem muszę ci przyznać rację :(
Majtek
Sep 9, 2008

Odp: 2D w OpenGL

Cytat:

szkoda tylko ze po angielsku, bo dogadac sie bym dogadał, ale moj angielski na czytanie kursów mi nie pozwoli.

polskie tłumaczenia warsztatu
http://www.aklimx.sppieniezno.pl/nehepl/index.php
możesz jak będziesz dalej się z nich uczył potłumaczyć i dodać tutaj
5corpio
Sep 9, 2008

Odp: 2D w OpenGL

Cytat:
Uwaga 2: niedawno dowiedziałem się że w Photku CS2 jest taki błąd, że źle zapisywane są pliki tga i można mieć z nimi problem i stracić sporo cennego czasu  W photku od 7.0 w dół takiego problemu nie było
Mógłbyś coś więcej powiedzieć ? Ponieważ właśnie miałem dziwne problemy z teksturami TGA które były różnych wymiarów np. 256x512 albo inne takie "niekwadratowe" w 3ds Maxie teksturowało się normalnie potem po wczytaniu do app. miałem zupełnie innaczej oteksturowany model. Masz jakieś źródło w którym to jest bardziej opisane ?

Edit: (Przepraszam, że to trochę nie z tematem)
LOR
Sep 10, 2008

Odp: 2D w OpenGL

Nie mam źródła niestety, taki problem wyszedł "w praniu" :) Natomiast podejrzewam, że gdzieś opisane to jest :) Sprawa wygląda tak: zapisujemy plik jako tga 32 bitowa bez RLE. Nasz out w photku 7.0 będzie wyglądać zgodnie ze specyfikacją formatu targa, czyli najpierw nagłówek a po nagłówku zgodnie z rozmiarami x*y (rozmiary z nagłówka) 4 bajtowe sekwencje - teksele, przy czym każda reprezentuje w postaci 8 bitowej kanały RGB i A. Problem w CS2 polega na tym, że ten kanał A jest nieprawidłowo zapisywany. Nie siedziałem z hexedytorem nad tym więc dokładnie co jest nie tak nie powiem, po prostu zamiast przezroczystości było białe tło a wszystkie a składowe A wszędzie ustawione na 255.
Regedit
Sep 14, 2008

Odp: 2D w OpenGL

Skoro w 3DS Max-ie działa dobrze to zapewne nie należy winić Photoshopa tylko swój kod. Poszukaj błędu. Czy na pewno współrzędne tekstury traktujesz jako od 0..1 na szerokość i na wysokość niezależnie od tego że tekstura nie jest kwadratowa? No i czy dobrze wczytujesz poszczególne składowe RGBA? (czy w jakiej one tam kolejności są, nie pamiętam)
5corpio
Sep 17, 2008

Odp: 2D w OpenGL

Właśnie nie wiem przejrze kiedy jeszcze mój kod bo pamiętam, że gdy zrobię taką samą teksturę tylko BMP to wtedy mam dobrze więc przejrze sobie mój kod do ładowania TGA.
(ale to nie o tym wątek chyba już :P)
Strony:
1 2