[ DjoleReject @ 28.07.2008. 12:08 ] @
Situacija je sledeca:

Razvijam gui sistem u directx-u. Vecina stvari je vec uradjena i funkcionise (crtanje prozora, dugmadi, slajdera, njihova funkcionalnost, hvatanje dogadjaja, minimizacija, maksimizacija prozora...), ali sada sam dosao do velikog problema: pisanje teksta. Naime, cini se da dx font radi tako sto napravi sprajt, pa onda crta po njemu, a sam sprajt nacrta na kraju scene. To mi ne odgovara, jer mi je neophodno da tekst bude iscrtan na odredjenom prozoru, a da drugi prozor koji je iznad njega prekriva i tekst prethodnog (kao i sve ostalo).
Mnogo sam guglao i cini se da resenje koje meni treba podrazumeva pravljenje custom klase za font. Da li negde postoje besplatne klase koje bi mi ustedele vreme? Video sam BMFont, gde se pravi bitmap font od sistemskog, a usput se dobija i zgodan txt fajl koji opisuje tako dobijenu targu. Usput sam nasao i neki tutorijal koji pokazuje odredjene nacine za citanje toga, ali i dalje mi se cini da je ogroman posao u pitanju, a ja nisam siguran da je cela ta halabuka meni uopste potrebna (ako postoji neki jednostavan nacin koji bi malo vise kostao u brzini crtanja fonta, ali bio brzi za implementaciju).


Drugi problem koji imam je crtanje u teksturu. Na jednom racunaru sam napravio sistem po kome se ceo GUI nacrta u jednu teksturu, pa se ta tekstura razvuce preko celog ekrana. To je radilo odlicno (osim sto je sve delovalo malo ruznije iseckano nego u direktnom crtanju). Onda sam ceo projekat preneo na drugi racunar i odjednom je doticna tekstura crna. Evo funkcija kojom to radim:

Code:

void WindowsManager::renderGui(IDirect3DDevice9* device, IDirect3DTexture9* tex){

    //backup renderTarget
    device->GetRenderTarget(0, &renderBackupSurface);
    //make target out of surface
    tex->GetSurfaceLevel(0, &renderSurface);
    device->SetRenderTarget(0, renderSurface);
        
    device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(105,5,5), 1.0f, 0 );
    
    ////////////////////////////////////////////////////////////////////
    device->BeginScene();
    

    device->SetTexture( 0, guiTexPtr );
    device->SetStreamSource(0, guiBuffer->getBuffer(), 0, sizeof(VertexTex) );
    device->SetFVF(FVF_TEX);
    bufferProjection(device);

    fnt->print("Umem da pisem", 350, 350, 0, BasicColors::BLACK);

    for(int i=0; i<guiBuffer->getVerticesSize(); i+=4){
        device->DrawPrimitive(D3DPT_TRIANGLEFAN, i, 2);
    }

    device->EndScene();
    ////////////////////////////////////////////////////////////////////

    //get back to screen
    device->SetRenderTarget(0, renderBackupSurface);
}



Odmah da napomenem da se ova funkcija poziva u glavnoj funkciji za crtanje, izmedju Begin i EndScene(). Negde sam nasao da to ne sme tako, ali nisam primetio razliku u odnosu na pozivanje ove funkcije pre ili posle.

Od stvari koje su mozda nejasne, najpre uzmem surface koji je pre ove funkcije target, pa ga stekujem, pa napravim drugi target (od teksture koja dolazi u funkciju), pa crtam gui u njega, pa vratim target na onaj koji je bio i pre funkcije.


P.S. Ovo je deo foruma koji je jako slabo posecen, tako da ako imate bilo kakvu (i najludju) ideju koja bi mozda mogla da pomogne, slobodno je napisite, sve je dobrodoslo. Ja sam relativno nov u DX programiranju, pa ce mi i neke stvari koje mozda smatrate opstepoznatima biti nove.
Hvala svima unapred.
[ DjoleReject @ 28.07.2008. 13:53 ] @
OK, ne znam da li ste i sami primetili, ali covek postaje pametniji kad postavlja teme po forumima :)
Nakon cetiri dana sam resio problem crtanja u teksturu, a resenje je sledece:

Ako imate dva razlicita RenderTargeta u programu, obavezno je da oba budu istog formata. Jedan od njih mora biti sam device (nalazi se u D3DPRESENT_PARAMETERS koji koristite za pravljenje device-a, a zove se BackBufferFormat) i taj format mora biti isti kao i format teksture u koju crtate u nekom drugom trenutku. Meni je razlika bila u tome sto je jedan od njih bio D3DFMT_R5G6B5, a drugi D3DFMT_A8R8G8B8. Verovatno je na jednom racunaru ta razlika bila nepostojeca, pa mi je uspelo da stvar proradi uprkos tome sto je pogresna.
Ako nekog zanima detaljnije o crtanju u teksturu, recite, pa cu staviti ovde mali tutorial.

Ostaje problem fonta. Svi su i dalje dobrodosli :)
[ tosa @ 28.07.2008. 13:56 ] @
Nije problem u različitosti formata, najverovatnije jedan od njih (verujem 565) nije ni podržan
kao render target na kartici na kojoj to nije radilo. 8888 je mahom podržan ali je u svakom slučaju
bolje, svaki format koji će se koristiti kao render target, proveriti pre upotrebe.
To možeš da vidiš u caps-ima divajsa.
[ DjoleReject @ 28.07.2008. 14:17 ] @
Oh, pa odlicno onda. Ja sam u stvari povrsnim citanjem slucajno dosao do resenja za svoj problem. Na linku: http://www.two-kings.de/tutorials/dxgraphics/dxgraphics16.html pise sledece:
Citat:

Rendering to a texture enables many possibilities, but there are also some restrictions you have to take care of. First the depth stencil surface must always be greater or equal to the size of the render target. Furthermore the format of the render target and the depth stencil surface must be compatible and the multisample type must be the same.


Iz nekog razloga sam ja shvatio da bi sami formati morali biti jednaki.

No dobro, ispada da je i piksel format jedna od milijardu stvari koje se moraju isproveravati pre upotrebe (sto moj kod cini potpuno necitljivim, jer je svaki drugi red ""if(FAILED" i slicno), ali sta da se radi, taki je pos`o...

Hvala toso.
[ deerbeer @ 01.08.2008. 08:37 ] @
Citat:
@DjoleReject
To mi ne odgovara, jer mi je neophodno da tekst bude iscrtan na odredjenom prozoru, a da drugi prozor koji je iznad njega prekriva i tekst prethodnog (kao i sve ostalo).

Jel si ukljucio Z-Buffer za tvoj D3D device ? Cini mi se da tako moze da se imitira efekat top prozora,
ako podesis da pozicije sprajtova, prozora itd budu u 3D kordinatnom sistemu.
[ DjoleReject @ 01.08.2008. 14:25 ] @
Citat:
deerbeer: Jel si ukljucio Z-Buffer za tvoj D3D device ? Cini mi se da tako moze da se imitira efekat top prozora,
ako podesis da pozicije sprajtova, prozora itd budu u 3D kordinatnom sistemu.


Meni prozori nisu sprajtovi, nego ih sklapam iz razlicitih delova teksture. Redosledom crtanja odredjujem koji je ispred, a koji iza. Inace, svaki prozor ima svoj bafer, a kad god se promeni scena, prodjem kroz niz vidljivih prozora i pokupim njihove vertices-e i strpam ih u jedan glavni vertex buffer gui-ja. Tako da moji prozori zaista jesu u 3D koordinatnom sistemu.
Prilikom samog crtanja, redosledom se odredjuje Z prozora, tako da nisam imao potrebe za Z bufferima, jer sam mislio da ce i tekst tako da se ponasa. Posto ovo ocito ne radi, otvoren sam za predloge.
[ deerbeer @ 01.08.2008. 15:36 ] @
Citat:
@DjoleReject
Prilikom samog crtanja, redosledom se odredjuje Z prozora, tako da nisam imao potrebe za Z bufferima, jer sam mislio da ce i tekst tako da se ponasa.

Pa nije bas tako ...pogledaj ovde mozda ces dobiti kompletnu sliku o Z-Buffer-u i kako se koristi
http://www.directxtutorial.com...l9/B-Direct3DBasics/dx9B6.aspx
[ DjoleReject @ 01.08.2008. 17:29 ] @
Citat:
deerbeer: Pa nije bas tako ...pogledaj ovde mozda ces dobiti kompletnu sliku o Z-Buffer-u i kako se koristi
http://www.directxtutorial.com...l9/B-Direct3DBasics/dx9B6.aspx


OK, izgleda da implementacija Z buffera nije toliki problem. Ostaje da skontam kako prokleta slova da z-baferujem...

Hvala, deerbeer.
[ DjoleReject @ 13.09.2008. 15:10 ] @
Aktiviracu ponovo ovu temu, jer mi se cini da je bolje tako nego da otvaram novu, ionako se nadovezuje...

Pitanje je - besplatna biblioteka za bitmap font.
Kao sto sam vec pominjao ovde, postoji jako zgodno programce koje pravi bitmap fontove (BMFont) tako sto ubaci sva slova na targu i napravi txt fajl u kome je opisano gde se koje slovo nalazi na dobijenoj slici. Verovatno takvih progrma ima puno i verovatno rade slicno kao i ovaj. E, sad, da li neko zna za besplatnu biblioteku koja bi radila sve sto se tice upotrebe ovakvih fontova - ucitavanje, parsiranje, crtanje (u nekoj savrsenoj varijanti i samu funkciju print(string...)?
Nije da je bas nemoguce napisati takvu stvar, ali nije ni zanemarljiv posao. Trebalo bi seckati sliku, razvlaciti dobijene slicice, i lepiti to na neki sprajt, pa to bacati na ekran (teksturu). Osecacu se jako glupo ako se izlomim radeci ovo da bih saznao da to vec negde postoji.

Hvala svima.