Skocz do zawartości
Pherael

101 pytań od Pheraela

Rekomendowane odpowiedzi

Temat zwałem tak, gdyż pytań zamierzam tutaj zadawać bez liku :P

 

Pytanie pierwsze, co robię źle:

Okej sam odkryłem ale zgłaszam, gdyż może to być błąd (tak mi się wydaje) , a mianowicie gdy dodałem linijkę z SetScreen

 

SCENE(GameScene)
{
    // zmieniamy ustawienia okna i aktualizujemy je
    Game.Windows( "main" )->SetScreen(1,0);        //  <--- Tą linijke dodałem o tą!!!!!!!!!!!!!!!!!!!!!!!
    Game.Windows( "main" )->Width = 800;    // szerokosc
    Game.Windows( "main" )->Height = 600;    // wysokosc
    Game.Windows( "main" )->Update();        // aktualizacja

 

nie działał mi fullscreen (testowałem pięć razy), dopiero jak poprawiłem na

SCENE(GameScene)
{
    // zmieniamy ustawienia okna i aktualizujemy je
    Game.Windows( "main" )->Width = 800;    // szerokosc
    Game.Windows( "main" )->Height = 600;    // wysokosc
        Game.Windows( "main" )->SetScreen(1,0);  //  <--- Tą linijke dodałem o tą!!!!!!!!!!!!!!!!!!!!!!!
    Game.Windows( "main" )->Update();        // aktualizacja

to zadziałało. Dziwne...

 

No to drugie, a właściwie pierwsze pytanie, które już zadałem na forum DIS czyli jak Xenon radzi sobie z alfablendingiem? (chodzi mi o wydajność, bo sdl mi nie wspierał alfablendingu sprzętowo) A jak z nadawaniem wartosci kanałowi alfa na podstawie maski (bitmapie w skali szarości), albo z mnożeniem dwóch kanałów alfa (sorki jeśli sformułowania są niefachowe, ale jestem samoukiem i do końca nie pamiętam jak to się zwie, ale mam nadzieję że się domyślisz o co mi chodzi)

 

Sorry, jeśli te pytania wydają ci się leniwe (żem se nie sprawdził), ale pracuję i mam średnio dwie godzinny dziennie na programowanie, a wolę xenona poznawać czynnie, niż czytając dokumentacje dokładnie :P

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Metoda SetScreen() dziala tylko na utworzonym oknie, wiec najlepiej ja dawac w procedurze SCENE w ustawieniach okna.

XenoN wspiera alpha blending sprzetowo, jak i reszte grafiki, te operacje akurat nie kosztuja karty zbyt wiele obliczen, wiec sa domyslnie wlaczone :)

co do masek, to tekstury od poczatku sa 4 kanalowe (kolor RGB i kanal przezroczystosci) a od niedawna mozna ladowac pliki roznych formatow w tym PNG z przezroczystoscia, oraz konwerter do tekstur XET posiada konwertowanie z tych samych formatow grafik (BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, EMF).

 

pamietaj, nie ma glupich pytan, sa tylko mniej inteligentne odpowiedzi, a pytajac nie pogubimy sie probujac na sile zrozumiec cos co moze wydawac sie trudne :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Hehe, po prostu się ubezpieczam :P Ogólnie dzięki za odpowiedzi, coraz lepiej mi idzie z Xenonem :) Co chwila mam jakiś problem, ale jakoś potrafię na razie sobie sam poradzić. Ale jedno pytanie mam, jednakowoż

 

Pytanie Trzecie (według oficjalnej numeracji - jeszcze tylko 98 i fajrant :P)

Czy istnieją inne metody konwersji z formatów liczbowych na XE_STRING inne niż .Format?

 

Ok, umknęło mi w dokumentacji, sam znalazłem.

 

To może żeby jednak o coś zapytać, co to jest to całe DNA?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

DNA to modele cial fizycznych w silniku, czyli ciala zbudowane z punktow, 'linek' je laczacych oraz powierzchni, ktore buduja szkielet zdolny do podpiecie pod umysl - sztuczna inteligencje bazujaca na sieci neuronowej filtrowanego sygnalu. czyli np. taki ragdoll ktory mysli (tylko ze budowanie umyslu to cholernie trudna robota, do tego musze skonczyc specjalny edytor) :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Pytań ciąg dalszy, a raczej powrót do już wspomnianego tematu alphablendingu. Potrzebuję dzielenia i mnożenia kanałow alfa - ok, to jestem w stanie napisać sobie sam, to są proste funkcje, problemem jest wyciągnięcie kanału alfa ze XE_SPRITE (albo z C_IMAGE) i włożeniem go tam z powrotem.

 

Kolejne o czym chciałbym zapytać, to funkcje XeCameraPerspective, co dokładnie robi? Bo opis "Uaktywnia projekcje perspektywistyczna" zbyt wiele mi nie mówi.

 

Pytam się, gdyż myślałem o wprowadzeniu w Arashi czegoś w rodzaju Perspektywy (takie coś jak było w Diablo 2, nie wiem czy kojarzysz). Na początku myślałem, że sam to sobie napiszę, ale pomyślałem, że być może w Xenonie znajdują się już narzędzia które mogłyby mi w tym pomóc. Nie ma co odkrywać koła po raz kolejny :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Po pierwsze i najważniejsze musisz wiedzieć że wszystkie operacje graficzne wykonują się na GPU zamiast na CPU jak to jest w przypadku allegro/sdl, dla tego tez alphablending jest tam wykonywany automatycnzie i jedynie zmienia się jego parametry funkcją XeSetState() lub szybciej Game.Blend(), dla tego tez nie potrzeba ręcznie modyfikować tekstur, ale dla ciekawskich jest to możliwe, np. w klasie XE_SPRITE istnieje metoda StreamOpen() która otwiera strumień i zwraca na niego wskaźnik (dane trzeba interpretować jako typ unsigned char razy 4 kanały na pixel).

 

XeCameraPerspective() ustala kamere na widok 3D, widać perspektywę, głębię w przeciwieństwie do XeCameraOrtho(); Można tego oczywiście użyć do izometrii jak w diablo 2 ale będzie to 3D z perspektywą, nie zaś prawdziwe izo. aby uzyskać izometrię należy pierw ustawić kamerę prostopadłą, czyli dać na przykład zwykłe Game.Camera.Update() jeśli Game.Camera.PerspectiveMode jest false, a następnie obrócić odpowiednio kamerę w ten sposób:

 

Game.Camera.Update(); // to juz mielismy normalnie
XeMatrixMode( XE_MATRIX_PROJECTION ); // przelaczamy sie na macierz projekcji
XeMatrixRotate( 45, 0, 1, 1 ); // obracamy o 45 stopni w osi Y (kat beta) i Z (kat alpha)
XeMatrixMode( XE_MATRIX_MODELVIEW ); // przelaczamy sie z powrotem na macierz widoku modelu

 

oczywiście nie sprawdzałem jeszcze takiej opcji, ale zakładam że powinno zadziałać, tak czy inaczej grafiki pozostaną "płaskie" więc lepiej albo robić tekstury od razu jako izo, lub użyć modeli 3D

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
w klasie XE_SPRITE istnieje metoda StreamOpen() która otwiera strumień i zwraca na niego wskaźnik (dane trzeba interpretować jako typ unsigned char razy 4 kanały na pixel).

Oto mi chodziło :) dalej już sobie poradzę. Tak jak ciekawostkę - potrzebuję obsługi alfablendingu aby łączyć kafle różnych terenów ze sobą. Można by to rozwiązać inaczej, ale gdy mam około 40 różnych rodzai terenu... musiałbym ręcznie narysować około 120 kafli jeszcze (po trzy na każdy typ terenu) a mi się nie chce :P Wolę już napisać kod który to za mnie zrobi.

 

Co do perspektywy - grafiki mam izometryczne, więc to nie problem, chodzi mi jedynie o ten specjalny efekt. Sprawdzę te rozwiązanie które mi podałeś, mam nadzieję że będzie wyglądało zacnie - w teorii właśnie o to mi chodziło, zobaczymy jak wyjdzie w praktyce.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Tak jak ciekawostkę - potrzebuję obsługi alfablendingu aby łączyć kafle różnych terenów ze sobą. Można by to rozwiązać inaczej, ale gdy mam około 40 różnych rodzai terenu... musiałbym ręcznie narysować około 120 kafli jeszcze (po trzy na każdy typ terenu) a mi się nie chce tongue2.gif Wolę już napisać kod który to za mnie zrobi.

takie rzeczy się wtedy robi jednym z dwóch sposobów, byle nie ten o którym teraz mówisz, bo zapcha potrzebną pamięć VRAM:

1. Rysujemy pierw kafel podkładu, na niego kafel przejscia z przezroczystoscia tam gdzie ma byc widoczny ten pierwszy.

2. Rysujemy z użyciem shadera multitexturingu: podajemy do shadera 3 tekstury, ktorymi sa tekstura bazowa, tekstura maski i tekstura przejsciowa, a w shaderze mieszamy te tekstury wzgledem maski.

pamietaj ze otwieranie strumienia to kosztowana operacja czasowa, nie powinno sie tego robic co klatke, jesli koniecznie chcesz edytowac zawartosc tekstury to jest bardzo latwy sposob na tworzenie nowej tekstury edytujac stara, jedyne czego potrzeba to uzyc XE_CANVAS, ktory jest tekstura jako powierzchnia rysowania, mozesz pod niego podpinac tekstury i je edytowac, grunt zeby mialy taki sam rozmiar jak sama powierzchnia. Jesli chcesz moge zrobic przyklad jak je uzywac :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Heh, masz rację - wydajnościowo by to nie przeszło. Nie bardzo się nad tym zastanawiałem.

Sposób Pierwszy - no własnie tego chciałem uniknąć. Za dużo rysowania.

Sposób drugi - to brzmi świetnie, ale szczerze - nie bardzo wiedziałbym jak to wykonać. - tutaj byłbym wdzięczny za przykład.

Co do XE_CANVAS - a da się w tym zrobić? No ja rozumie, że można tam połączyć dwie tekstury, ale czy przejście między nimi nie będzie wtedy ostre?

 

Następna sprawa - jak się sortuje kontenery? Tu byłbym wdzięczny za przykład, bo mam kontener (XE_ELEMENTS) i chciałbym posortować w nim obiekty według wartości jednego z pól obiektu. Ale ta cała funkcja foo - nic mi nie mówi.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

mieszanie tekstur na shaderze:

http://psichix.gmclan.org/download.php?fil...ureBlending.zip

mieszanie na canvas zapodam gdy tylko naprawie jeden mały błąd, albo przepisze na nowo przykład :P

 

sortowanie elementów:

struktura i funkcja sortująca:

struct Test
{
    double value;
    Test()
    {
        value = XE_MATH::Random( 10 );
    };
};

// funkcja sortujaca od najwiekszego do najmniejszego
int SortFunc( Test* a, Test* b )
{
    if( a->value > b->value ) return( 1 );    // kolejnosc wlasciwa
    if( a->value == b->value ) return( 0 );    // wartosci identyczne
    if( a->value < b->value ) return( -1 );    // kolejnosc niewlasciwa, zamieniamy miejscami
}

XE_ELEMENTS< Test > container;

dodanie elementów i sortowanie:

repeat( 10 ) container.AddPointer( Test() );
container.Sort( SortFunc );

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Po krótkiej przerwie wracam z pytaniami. Chciałbym zapytac się o obiecany tutek dotyczący XE_CANVAS, bardzo by mi się przydał gdyż aktualnie przerabiam mój edytor, aby korzystał z VBO.

 

Z tym całym VBO mam parę pytań - bo powiedzmy ze mapa ma dwie warstwy, jedna z podłożem, druga z małymi roślinkami. Jak to zrobić najlepiej? Narysować jedną warstwę na jednym płótnie, a drugą na drugim a później wyświetlić obie?

 

Inne pytanie - powiedzmy ze woda jest animowana, albo jeszcze lepiej używam shadera Water 2D - jak to połączyć z kaflami rysowanymi w VBO? Chodzi mi o to żeby shader dotyczył tylko jednego kafla. To samo dotyczy bumpmapingu :) (W mojej grze teren wygląda jak w Age and Empires II - istnieją wzniesienia i obniżenia terenu - pomyślałem, ze bumpmaping byłby świetny do ich cieniowania)

 

Myślę tez nad użyciem animacji szkieletowej (powoli zabieram się za sama grę), na razie jedynie pobieżnie przejrzałem tutka i mam pytanie - czy nadaje się to do animacji postaci w rzucie izometrycznym?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

może najpierw sprostuję: VBO to bufor wierzchołków, zaś bufor koloru to FBO ;)

 

powiedzmy ze mapa ma dwie warstwy, jedna z podłożem, druga z małymi roślinkami. Jak to zrobić najlepiej? Narysować jedną warstwę na jednym płótnie, a drugą na drugim a później wyświetlić obie?

jeśli podłoże jest statyczne (jedna grafika) to lepiej rysować je bezpośrednio na scenę, pomijając płótno, a jeśli to kilka elementów które będą zmieniane co jakiś czas to rysujemy je na płótno i potem wyświetlamy obie warstwy. Ja na przykład ustawiam aktorom podłoża większy Order niż obiektom roślin, tym samym zupełnie omijam rysowanie na płótno, a jedynie sprawdzam czy aktor znajduje się w polu widzenia.

 

powiedzmy ze woda jest animowana, albo jeszcze lepiej używam shadera Water 2D - jak to połączyć z kaflami rysowanymi w VBO? Chodzi mi o to żeby shader dotyczył tylko jednego kafla. To samo dotyczy bumpmapingu smile.gif (W mojej grze teren wygląda jak w Age and Empires II - istnieją wzniesienia i obniżenia terenu - pomyślałem, ze bumpmaping byłby świetny do ich cieniowania)

najlepiej wtedy zrobić osobne mapy kaflowe dla elementów z różnymi shaderami, czyli osobna mapa z kaflami wody i osobna z kaflami ziemi, wtedy przed rysowaniem wody aktywujesz shader Water2D, następnie rysujesz kafle wody, potem aktywujesz shader bumpmappingu, rysujesz ziemie i dezaktywujesz shadery - to jest najszybszy sposób.

 

Myślę tez nad użyciem animacji szkieletowej (powoli zabieram się za sama grę), na razie jedynie pobieżnie przejrzałem tutka i mam pytanie - czy nadaje się to do animacji postaci w rzucie izometrycznym?

potrzeba by się nie mało nagimnastykować aby to się zgrała animacja.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ogólnie wielkie dzięki za odpowiedzi, bardzo mi pomogły.

 

może najpierw sprostuję: VBO to bufor wierzchołków, zaś bufor koloru to FBO

Właściwie to chodziło mi właśnie o bufor wierzchołków (do rysowania kafli, jak w tym twoim przykładzie). Szczerze, większość z tych zagadnień jest dla mnie nowa i nawet za bardzo nie wiem, co to jest FBO.

 

najlepiej wtedy zrobić osobne mapy kaflowe dla elementów z różnymi shaderami, czyli osobna mapa z kaflami wody i osobna z kaflami ziemi, wtedy przed rysowaniem wody aktywujesz shader Water2D, następnie rysujesz kafle wody, potem aktywujesz shader bumpmappingu, rysujesz ziemie i dezaktywujesz shadery - to jest najszybszy sposób.

Mam pytanie dotyczące bufora wierzchołków - powiedzmy, że rysuje same kafle wody - część kafli jest po prostu pusta(tam gdzie są kafle suchego terenu). I tutaj mam problem ze sformułowaniem odpowiedniego pytania, tak żebym został zrozumiany. Kiedy tworze bufor wierzchołków kafli wody, jak zaznaczyć te puste miejsca? Po prostu nie mapować indeksy wierzchołków tych kafli?

 

Jeszcze raz poproszę o tutka do Canvas, czy chociaż dodania go do kolejki tutków do zrobienia :P Heh, męczący jestem :P Co prawda, zauważyłem już, że aktualnie jestem w stanie się bez niego całkowicie obejść, lecz założenia gry (w tym techniczne) wciąż się u mnie zmieniają, a może to być użyteczne narzędzie.

 

A tutaj tak dla pochwalenia się, efekt wzgórz (one nie bedą tak kanciasto wyglądać, to tylko wersja dla testów)

edytor.jpg

 

Ogólnie sorry za lamerstwo, jeszcze sie wyrobię :P

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Właściwie to chodziło mi właśnie o bufor wierzchołków (do rysowania kafli, jak w tym twoim przykładzie). Szczerze, większość z tych zagadnień jest dla mnie nowa i nawet za bardzo nie wiem, co to jest FBO.

FBO właśnie jest tym na czym bazuje płótno (canvas) - na FBO można rysować jak do zwykłej tekstury i potem to użyć do innych celów jako konkretną teksturę (np. efektu blurowania / blooma).

 

Kiedy tworze bufor wierzchołków kafli wody, jak zaznaczyć te puste miejsca? Po prostu nie mapować indeksy wierzchołków tych kafli?

dokładnie tak, wystarczy ominąć indeksy wierzchołków kafli na których nie ma wody.

 

Jeszcze raz poproszę o tutka do Canvas, czy chociaż dodania go do kolejki tutków do zrobienia tongue2.gif Heh, męczący jestem tongue2.gif Co prawda, zauważyłem już, że aktualnie jestem w stanie się bez niego całkowicie obejść, lecz założenia gry (w tym techniczne) wciąż się u mnie zmieniają, a może to być użyteczne narzędzie.

obiecuje zrobić jak tylko uwolnię się od zlecenia, będzie to pierwszy w kolejce tutek.

 

A tutaj tak dla pochwalenia się, efekt wzgórz (one nie bedą tak kanciasto wyglądać, to tylko wersja dla testów)

no prosze :) 3d czy izo w 2D?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
no prosze :) 3d czy izo w 2D?

Izometryczne 2D, według własnej receptury :P

 

Próbowałem dodać efekt wody 2d, ale coś nie wygląda :/

edytor2.jpg

 

Nie wiesz co może być przyczyną?

 

tutaj funkcja rysująca mapę, choć to kod niemal żywcem wycięty z Tutka o shaderze Water 2D.

    
        if (i==2) // jeśli teren jest wodą
        {
            factor += XE_EVENTS::Use().DeltaTime * 0.1f;
            factor = fmod( factor, 1.0f );

            // aktywujemy efekt, przebieg 0
            Game.Effects( "effect" )->Activate( 0 );
            int id;
            // szukamy id zmiennej shadera
            id = Game.Effects( "effect" )->FindVariable( 0, "Offset" );
            // nadajemy wartosc wektorowa zmiennej shadera
            XE_EFFECT::SetVariable( XEF_SL, id, XE_HALFVECTOR( factor, factor ), 2 );
            id = Game.Effects( "effect" )->FindVariable( 0, "LightDir" );
            XE_EFFECT::SetVariable( XEF_SL, id, XE_HALFVECTOR( cos( XE_MATH::DegToRad( factor * 360 * 2 ) ), sin( XE_MATH::DegToRad( factor * 360 * 2 ) ), 1.0f ).Normalize(), 3 );
            // przelaczamy jednostke teksturowania na 2
            XeTextureUnit( 2 );
            // aktywujemy bierzaca teksture odbicia
            XeTextureActivate( Game.Sprites( "reflectionmap" )->GetCurrent() );
            // przelaczamy jednostke teksturowania na 1
            XeTextureUnit( 1 );
            // aktywujemy bierzaca teksture normalmapy
            XeTextureActivate( Game.Sprites( "normalmap" )->GetCurrent() );
            // przelaczamy jednostke teksturowania na 0
            XeTextureUnit( 0 );
        }
                //ustawienie tekstury terenu
                XeTextureActivate( mapaEdytora.listaTerenow[i].Tileset );
        // rysowanie bufora wierzcholkow
        mapaEdytora.listaTerenow[i].Tiles.Draw();
        //XeTextureUnactivate();
        XE_EFFECT::Unactivate();
    }

 

Edit:// Kod jest dobry, funkcja draw dla Sprite działa normalnie. Hmm, czy coś robię źle?

 

POŁĄCZONO:

 

Heh, może i dostanę warna, za post pod postem, ale muszę ponownie zapytać, bo mi przez to prace stanęły i strasznie mnie to męczy.

 

przed rysowaniem wody aktywujesz shader Water2D, następnie rysujesz kafle wody, potem aktywujesz shader bumpmappingu, rysujesz ziemie i dezaktywujesz shadery - to jest najszybszy sposób.

 

Kiedy tak robię, efekt jest bardzo odmienny od założonego (vide post wyżej) - co ciekawe dotyczy to tylko Water2D. Sprawdzałem działanie Waves oraz Reflection Mapping i działają z moją mapą kaflową bez zarzutu. No i sam efekt Water2D nie działa jedynie z mapą kaflową - przy rysowaniu spritów działa normalnie. Czy możliwe że jest to jakiś błąd w silniku? Czy ja coś knocę?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

water 2D wymaga by pierw narysowac kafle wody na przezroczysty canvas, dopiero wtedy mozna go uzyc. dzis raczej bede krotko na kompie w domu (w pracy komp nie obsluguje shaderow) wiec dopiero jutro moge zarzucic przykladem. z rysunku powyzej wnioskuje ze jest dobrana zla tekstura maski, jesli mozesz, zarzuc kodem na PM jak wyglada rysowanie, pokombinujemy z tym :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Życie mi ratujesz. Jeśli nie masz czasu dzisiaj to ok - nie będę ci zawracał dzisiaj już głowy. Wystarczy że mnie naprowadziłeś, co może być nie tak - sam dziś coś pokombinuję, a jak mi się nie uda, to zwrócę się do ciebie jutro i wyślę ci kod.

 

Tekstura maski jest ta sama co w twoim przykładzie, po prostu ją skopiowałem.

 

Narka i jeszcze raz dzięki za odpowiedz.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ok, poradziłem sobie z wodą, rzeczywiście problem był z teksturom. Całe zamieszanie polega na tym, iż gdy używam shadera Water 2D rysuje całą teksturę podłoża, a nie przycina ją według koordynatów. To pewnie kwestia parametrów, ale zmyliło mnie to, że dla innych shaderów przycinało mi teksturę normalnie. Jeszcze nie orientuję się zbyt pewnie w shaderach.

 

Druga sprawa, chodzi mi o funkcję XeDrawData, mógłbyś ją dokładniej objaśnić do czego służą parametry color (wiem, że to wskaźnik na bufor koloru, ale co to jest i co robi) oraz normal (jak wyżej, co to jest i co robi) i to samo z indices oraz attribs. Łopatologiczne wyjaśnienia jak dla kretyna mile widziane :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Funkcja XeDrawData() to bazowa funkcja rysująca w xenonie, wszystko się na niej opiera i służy ona do renderowania tablic/buforów wierzchołków.

parametr color przyjmuje wskaznik na bufor koloru, czyli tablice danych typu XE_VECTOR (jeśli valtype równe jest XE_DOUBLE) lub typu XE_HALFVECTOR (jeśli valtype równe jest XE_SINGLE) - poszczególne składowe wektora odpowiadają wartościom RGBA: x=>r, y=>g, z=>b, w=>a. tablica kolorów musi mieć taką samą ilość elementów jak tablica wierzchołków, bo każdy element koloru odpowiada poszczególnemu wierzchołkowi. Podobnie ma się rzecz z normal - jest to wskaźnik na bufor wektorów normalnych i tym razem nie możemy użyć typu danych XE_VECTOR czy XE_HALFVECTOR bo normalne muszą przyjmować wartości 3-kanałowe, czyli tylko XYZ, bez składowej W, dla tego robimy pierw strukturę:

struct vecNormal{float X,Y,Z;}; // jeśli valtype równe jest XE_SINGLE

lub:

struct vecNormal{double X,Y,Z;}; // jeśli valtype równe jest XE_DOUBLE

i dopiero wtedy tworzymy tablice/bufor typu vecNormal. Normalne przydają się do obliczeń światła, w innych przypadkach do normalnego użytku nie są potrzebne. Attribs to wskaźnik na bufor atrybutów wierzchołków także w formacie XE_VECTOR lub XE_HALFVECTOR, przydatnych do przesyłania osobnych wartości dla różnych wierzchołków do shadera, zamiast trzymać je w uniformach. Atrybuty przydają siętylko przy shaderach, w normalnym renderingu nie są potrzebne. Indices zaś jest tablicą elementów typu unsigned int i zawiera w sobie indeksy kolejnych wierzchołków do renderingu. Pomaga to przyspieszyć rendering przy dublujących się wartościach wierzchołków (np. rysowanie boxa w 3D - zamiast mieć w buforze wierzchołków powielone wierzchołki rogów bryły, daje się tylko same rogi w tablicy i w buforze indeksów ustala się kolejność rysowania).

mały przykład rysujący quada w płaszczyźnie 2D:

 

class vecNormal
{
public:
float X,Y,Z;
vecNormal(x=0,y=0,z=0)
{
X=x;
Y=y;
Z=z;
}
};

XE_HALFVECTOR vertices[ 4 ] = {
XE_HALFVECTOR( -100, -100 ),
XE_HALFVECTOR( 100, -100 ),
XE_HALFVECTOR( 100, 100 ),
XE_HALFVECTOR( -100, 100 )
};

XE_HALFVECTOR coords[ 4 ] = {
XE_HALFVECTOR( 0, 0 ),
XE_HALFVECTOR( 1, 0 ),
XE_HALFVECTOR( 1, 1 ),
XE_HALFVECTOR( 0, 1 )
};

vecNormal normals[ 4 ] = {
vecNormal( 0, 0, -1 ),
vecNormal( 0, 0, -1 ),
vecNormal( 0, 0, -1 ),
vecNormal( 0, 0, -1 )
};

unsigned int indices[ 4 ] = {
0,
1,
2,
3
};

// odkładamy macierz transformacji na stos (zapamiętujemy początkowy jej stan)
XeMatrixPush();
// przesuwamy transformacje obiektów
XeMatrixTranslate( XE_VECTOR( 200, 200 ) );
// aktywujemy teksture
XeTextureActivate( Game.Sprites( "sprite" )->GetCurrent() );
// rysujemy tablice wierzchołków
XeDrawData(
XE_QUADS, // prymitywami w buforze są quady
0, // zaczynamy od elementu bufora o indeksie 0
4, // rysujemy 4 wierzchołki
vertices, // tablica wierzchołków
colors, // tablica kolorów
coords, // tablica koordynatów tekstury
normals, // tablica normalnych
indices, // tablica indeksow
NULL, // brak tablicy atrybutów
XE_SINGLE // typ danych: float (pojedyncza precyzja)
);
// zdejmujemy macierz transformacji ze stosu (przywracamy początkową)
XeMatrixPop();

tak mniej więcej działa rysowanie sprajtów.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×