Autor Wątek: silnik - nie-renderowanie niewidocznych powierzchni  (Przeczytany 7084 razy)

Offline Esidar

  • Użytkownik

# Grudzień 31, 2006, 17:22:33
Za dużo przeksztalceń macierzy. 4 + push/pop. Ręcznie przesuń i obróć. Albo wyznacz samemu macierz raz dla sprite'a i ją załaduj w całości.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline mINA87

  • Użytkownik

# Grudzień 31, 2006, 17:39:05
1. Instancing z ShaderModel 3.0 :P, Vertex Texture Fetch również z SM3.0, shadery transformujące jakąś ograniczoną grupę spriteów, transform dostają jako parametry ^^ (to w ramcach żartu)
2. Ręczna translacja wierzchołków i przesyłanie przetworzonych masowo.
3. Podejście takie jakie stosujesz

maxest

  • Gość
# Grudzień 31, 2006, 19:05:12
zebym byl troche madrzejszy to bym recznie wszystko policzyl ale prawde mowiac nie wiem jak mialbym wykonac

glTranslatef(x, y, z);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glTranslatef(-x, -y, -z);
glTranslatef(deviation, 0.0f, 0.0f);

pojedynczym wzorem :)

Offline mINA87

  • Użytkownik

# Grudzień 31, 2006, 19:58:57
Jak to jak? :] Jeśli matma i tworzenie macierzy Ci straszne, to chociażby tak:
1. Ustawiasz sobie te swoje transformacje
2. Pobierasz macierz z maszyny stanów do swojej struktury
3. Ładujesz macierz jednostkową żeby nie dokonywać transformacji na wierzchokach, bo te już będą przetworzone
4. Bierzesz po kolei każdy wierzchołek sprite'a i mnożysz przez uzyskaną macierz.
5. Rysujemy przetworzone wierzchołki.
Voila :]

maxest

  • Gość
# Grudzień 31, 2006, 23:49:58
no fakt! :) ze tez o tym nie pomyslalem :) dzieki bardzo i ++ do zarcia ;)

maxest

  • Gość
# Styczeń 01, 2007, 16:26:50
hmmm... chyba dzis rano mnie olsnilo :)
- tworze sobie te wszystkie cztery macierze (wlasciwie to trzy bo te ostatnie dwie mozna latwo zamienic na jedna :))
- mnoze je przez siebie w odpowiedniej kolejnosci
- mnoze uzyskana macierz przez wierzcholek, gdzie w = 1.0
- mnoze wszystkie wspolrzedne kazdego wierzcholka przez 1/w zeby uzyskac w wyniku w czwartej skladowej wartosc 1.0
Voila?... :)

// EDIT
wpadl mi jeszcze jeden fajny pomysl. do utworzenia tej macierzy potrzebuje takich danych: kat (angle) i odchylenie (deviation -> wektor 2D). moglbym te dane przeslac do shader'a przez wektor normalny (ktorego w ogole nie wykorzystuje; poza tym nie umiem niestety tworzyc wlasnych semantyk) i wlasnie w shader'ze policzyc sobie macierz i przemnozyc przez wspolrzedne wierzcholka, a dopiero na koniec w shader'ze przez macierz ModelViewProj. dobrze to wykombinowalem?
« Ostatnia zmiana: Styczeń 01, 2007, 16:45:50 wysłana przez maxest »

Offline Spider100

  • Użytkownik
    • Strona domowa

# Styczeń 01, 2007, 16:47:21
zebym byl troche madrzejszy to bym recznie wszystko policzyl ale prawde mowiac nie wiem jak mialbym wykonac

glTranslatef(x, y, z);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glTranslatef(-x, -y, -z);
glTranslatef(deviation, 0.0f, 0.0f);

pojedynczym wzorem :)

A co to robi tak w ogóle bo jakieś dziwactwo stworzyłeś i na pewno można prościej bez zbędnych kombinacji ...

Offline mINA87

  • Użytkownik

# Styczeń 01, 2007, 16:56:41
Piałem już o możliwości wykorzystania shaderów :]
Hmm no można prościej, np zamiast przenosić do umownego początku układu współrzędnych, i obracać względem niego, to można obrócić podając jako oś obrotu to miejsce z którego przesuwaliśmy :P No ale why not? :P To tylko kilka mnożeń więcej :P

Offline Spider100

  • Użytkownik
    • Strona domowa

# Styczeń 01, 2007, 18:48:30
Piałem już o możliwości wykorzystania shaderów :]
Hmm no można prościej, np zamiast przenosić do umownego początku układu współrzędnych, i obracać względem niego, to można obrócić podając jako oś obrotu to miejsce z którego przesuwaliśmy :P No ale why not? :P To tylko kilka mnożeń więcej :P

No ba można jeszcze prościej nie przenosząc wierzchołków w globalnym układzie tylko lokalnym wtedy mamy obrót + przesunięcie tak jak to się robi poprawnie.
Dam trochę kodu bo maxest widać w złym kierunku idzie :)

glPushMatrix();
MulMatrix2x2(mRotation, vPosition);
Draw(Obiekt); // Tu rysujemy dowolny obiekt ale w lokalnym układnie (bez przenoszenia wierzchołków) może być przeskalowany
glPopMatrix();

gdzie MulMatrix2x2 to:

procedure MulMatrix2x2(const M: Tm2x2; pos: TVector2D);
var
  mat: array[0..15] of single;
begin
  mat[0] := M.m[0][0]; mat[1] := M.m[1][0]; mat[2] := 0; mat[3] := 0;
  mat[4] := M.m[0][1]; mat[5] := M.m[1][1]; mat[6] := 0; mat[7] := 0;
  mat[8] := 0; mat[9] := 0; mat[10] := 1; mat[11] := 0;
  mat[12] := pos.x; mat[13] := pos.y; mat[14] := 0; mat[15] := 1.0;

  glMultMatrixf(@mat);
end;


Macierz rotacji można zbudować w prosty sposób

function m2x2(const angle: single): TMatrix2x2;
var
  c, s: single;
begin
  c := cos(angle);
  s := sin(angle);
  result.m00 := c; result.m10 := s;
  result.m01 := -s; result.m11 := c;
end;

Zamiast mówić że się nie zna matematyki lepiej sobie trochę poszperać, poszukać i zamiast wykonywać operacje na kątach przerzucić się właśnie na macierze zalet jest sporo np:
- łatwość komunikacji z ogl co za tym idzie większa wydajność (nie trzeba ciągle konwertować)
- proste szukanie macierzy look at
- pisanie podstawowej fizyki i tak będzie wymagało takiej reprezentacji kątów

Pozdrawiam i powodzenia bo się przyda :P
Spider ^*^
« Ostatnia zmiana: Październik 19, 2010, 00:03:21 wysłana przez Spider100 »

Offline mINA87

  • Użytkownik

# Styczeń 01, 2007, 19:28:57
Ano Spider100 :] Tyle że też coś takiego miałem na myśli, może się źle wyraziłem - rotacja w lokalu, i translacja lokalnych współrzędnych :]
A skoro o rotacji mowa to warto zainteresować się quaternionkami bo całkiem fajnie też kąty reprezentują i jak przyjdzie zaanimować coś z obrotem, to lepiej SLERPem niż LERPem :]

maxest

  • Gość
# Styczeń 01, 2007, 21:12:59
wiem - spieprzylem calkowicie z ta dodatkowa translacja (-x, -y, -z) - wszystko bylo w globalnym ukladzie a winno byc w lokalnym, jak mowicie. kiedys juz mialem ten problem i go nawet rozwiazalem a tutaj znow sie na to zlapalem :D
co nie zmienia faktu ze pozostale dwa przeksztalcenia wrzuce do shader'a przekazujac przez wektor normalny. raczej bedzie to dzialac wydajniej niz to co mam obecnie :)