.[ ČeskéHry.cz ].
Optimalizace hry v SDL
Jdi na stránku Předchozí  1, 2, 3, 4  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 4. únor 2008, 17:29:42    Předmět: Odpovědět s citátem

Tak texturu jako takovou nactes uplne stejne jako ji pravdepodobne nacitas ted pres SDL_image.
Texturu si vytvoris napriklad v Gimpu. Texturu, ktera bude mit jeste kanal pruhlednosti, kde casti, ktere maji byt videt maji alpha kanal blizko k 1.0f (255). Pixely, ktere nemaji byt videt, blizko 0. Pruhledne mezi temito dvema hodnotama.

Pri vytvareni textury zvolis jeji typ jako GL_RGBA ( sedmy parametr funkce glTexImage2D(...) )

A pri inicializaci OpenGL jeste zapnes alpha testing
kód:

glAlphaFunc(GL_GREATER, 0.1f); // Nastavení alfa testingu tak, ze se zobrazi jen pixely, ktere maji hodnotu alpha kanalu vetsi nez 10%
glEnable(GL_ALPHA_TEST);// Zapne alfa testing

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Nastavení alfa blendingu
glEnable(GL_BLEND);



PS.: texturu si v podstate ani nemusis vytvaret v Gimpu s alfakanalem. Staci si napsat funkci, ktera z nactenych dat textury provede orezani tak. ze vsem pixelum urcite barvy (vetsinou RGB(255, 0, 255)) nastavi alfa kanal na 0 a ostatnim na 1.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Standalf



Založen: 29. 01. 2008
Příspěvky: 32
Bydliště: Děčín

PříspěvekZaslal: 4. únor 2008, 20:24:44    Předmět: Odpovědět s citátem

Bez alpha kanalu nevim jak to myslis, jako teoreticky jo, ale prakticky ne.

A jde ten .bmp obrazek nastavit s alpha i v photoshopu? Ja to tam totiz u ulozeni nevidel.

A hlavne, jestli potom prejizdeni objektu bude cisty a ne, ze budou videt oba jako to je tedka, jinak nema cenu to zkouset. Nebo neslo by to upravit v blendingu aby ta kulicka pri prejizdeni nebyla napul idet s objektem co prejizdi, ale aby ten objekt co prejizdi videt nebyl?

Diky za rady
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 5. únor 2008, 12:10:19    Předmět: Odpovědět s citátem

BMP neumí alpha kanál, použij PNG. To, co chceš, je správně implementovaný alphablending, tzn. alpha kanál nutně potřebuješ.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 5. únor 2008, 12:13:28    Předmět: Odpovědět s citátem

no proste to pole, ktere predavas funkci glTexImage2D(...) jako posledni parametr je pole pixelu o velikosti rozmeru textury vynasobene poctem bitu na pixel.

Takze kdyz mas texturu typu GL_RGB, tak ma 3 bity na kanal. A ty z ni potrebujes udelat 4bitovou texturu GL_RGBA8.

udelas treba takto :
kód:
char * new_texture = new char[4*texture_size_x*texture_size_y];
for(int i = 0; i < texture_size_x*texture_size_y; i++)
{
   new_texture[i*4]   = old_texture[i*3];    // kopie R kanalu
   new_texture[i*4+1] = old_texture[i*3+1];  // kopie G kanalu
   new_texture[i*4+2] = old_texture[i*3+2];  // kopie B kanalu
   // vytvoreni alfakanalu textury tim, ze mista s barvou RGB(255, 0, 255) budou mit alfu 0 (tedy nebudou viditelna)
   // a ostatni mista textury budou mit alfu 255, tedy plnou viditelnost
   new_texture[i*4+3] = (old_texture[i*3] == 255 && old_texture[i*3+1] == 0 && old_texture[i*3+2] == 255) ? 0 : 255;
}


Jinak s alpha testingem bude vysledek dokonaly, a bude to vypadat uplne korektne, tedy zadna prusvitnost a podobne veci zpusobujici blending. Jinak viz http://www.ceske-hry.cz/forum/viewtopic.php?t=82 , abys videl, jak dokonale to bude Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 5. únor 2008, 16:25:31    Předmět: Odpovědět s citátem

Weny Sky napsal:
GL_RGB, tak ma 3 bity na kanal. A ty z ni potrebujes udelat 4bitovou texturu GL_RGBA8.

Ne, RGB má 8bitů na kanál, 3 bajty na pixel, u RGBA 4 bajty na pixel.

Weny Sky napsal:
Jinak s alpha testingem bude vysledek dokonaly, a bude to vypadat uplne korektne, tedy zadna prusvitnost

1) Pomocí alphablendingu jde dosáhnout úplně stejného výsledku jako s pomocí alphatestu.
2) Alphatest způsobuje na okrajích aliasing a nepomůže ani MSAA, vyhladit to umí jen některé karty. Pro vyhlazení u alphablendingu by mělo stačit filtrování textury.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Standalf



Založen: 29. 01. 2008
Příspěvky: 32
Bydliště: Děčín

PříspěvekZaslal: 5. únor 2008, 17:03:40    Předmět: Odpovědět s citátem

Takze:

char * new_texture = new char[4*surface->w*surface->h];

a tu old_texture takhle:

char * old_texture = new char[3*surface->w*surface->h];

a ten tex image mam takhle:

glTexImage2D( GL_TEXTURE_2D, 0, 3, surface->w, surface->h, 0, GL_BGR, GL_UNSIGNED_BYTE, new_texture );

No, prejede to sice dobre, jenze obrazky jsou zohaveny, spis to jsou jen barevny cary.

Je to kvuli tomu, ze to jsou bmp?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Standalf



Založen: 29. 01. 2008
Příspěvky: 32
Bydliště: Děčín

PříspěvekZaslal: 5. únor 2008, 17:24:04    Předmět: Odpovědět s citátem

A jak muzu dosahnout nepruhlednosti pri prejizdeni kosticky s blendingem?

Diky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 5. únor 2008, 17:39:55    Předmět: Odpovědět s citátem

Ad glTexImage: 3. parametr by měl být buď 4 nebo GL_RGBA8 (mělo by to být to samé, ale spíš bych použil to druhé), 7. parametr by měl být GL_BGRA.

BMP s tím nemá nic společnýho, to je jenom formát bitmapy na disku.

Alphablending, jak ho tak já a spousta lidí nazývá, je blending s rovnicí img*alpha + fb*(1-alpha). Argumenty img a fb jsou pevné, pravé operandy operátoru * nastavíš takto:
kód:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Pokud používáš novější verzi GL, znaménko + uprostřed se nastavuje pomocí:
kód:
glBlendEquation(GL_FUNC_ADD);

Ve starších verzích GL se to znaménko nastavovat nemusí (je tak už defaultně a nejde měnit).
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Standalf



Založen: 29. 01. 2008
Příspěvky: 32
Bydliště: Děčín

PříspěvekZaslal: 5. únor 2008, 17:52:36    Předmět: Odpovědět s citátem

Jenze kdyz ten blending nastavim tak, jak rikas tak je to stejne, jako by tam vubec nebyl. Chci rict, cerna barva okolo kulicky (bmp) neni zpruhlednena.

Ja prave potrebuju, aby se zpruhlednila, ale pri prejizdeni nebyla pruhledna.
Stacilo by, kdby nejak slo udelat, aby se zpruhlednilo jen to cerny okolo kulicky...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Kaemon



Založen: 28. 07. 2007
Příspěvky: 33

PříspěvekZaslal: 5. únor 2008, 18:42:22    Předmět: Odpovědět s citátem

nepoužil jsi náhodou kód od Weny Sky a zprůhledňuješ fialovou (255,0,255)?

jestli jo tak musíš:
kód:
new_texture[i*4+3] = (old_texture[i*3] == 255 && old_texture[i*3+1] == 0 && old_texture[i*3+2] == 255) ? 0 : 255;

nahradit
kód:
new_texture[i*4+3] = (old_texture[i*3] == 0 && old_texture[i*3+1] == 0 && old_texture[i*3+2] == 0) ? 0 : 255;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 6. únor 2008, 04:44:51    Předmět: Odpovědět s citátem

Jo přesně tak - máš to neprůhledné právě proto, žes správně nenastavil alpha kanál v textuře. Je logický, že když ho uděláš celý bílý, že bude všechno neprůhledný.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Standalf



Založen: 29. 01. 2008
Příspěvky: 32
Bydliště: Děčín

PříspěvekZaslal: 6. únor 2008, 15:35:38    Předmět: Odpovědět s citátem

Eosie napsal:
Jo přesně tak - máš to neprůhledné právě proto, žes správně nenastavil alpha kanál v textuře. Je logický, že když ho uděláš celý bílý, že bude všechno neprůhledný.


Ten alpha kanál jsem nastavil jak psal Weny Sky a pak musel opravit z ty fialovy barvy.

Tedka se mi zobrazuje jen bila tecka a je jedno, jestli mam zapnutou alpha nebo blending, nicim se to nemeni Rolling Eyes
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 6. únor 2008, 16:01:57    Předmět: Odpovědět s citátem

http://nopaste.ceske-hry.cz - ukaz kod
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Standalf



Založen: 29. 01. 2008
Příspěvky: 32
Bydliště: Děčín

PříspěvekZaslal: 7. únor 2008, 21:32:37    Předmět: Odpovědět s citátem

rezna napsal:
http://nopaste.ceske-hry.cz - ukaz kod


http://nopaste.ceske-hry.cz/903
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 7. únor 2008, 22:02:18    Předmět: Odpovědět s citátem

Z tvého kódu:
kód:
// vytvoreni alfakanalu textury tim, ze mista s barvou RGB(255, 0, 255) budou mit alfu 0 (tedy nebudou viditelna)
// a ostatni mista textury budou mit alfu 255, tedy plnou viditelnost
new_texture[i*4+3] = (old_texture[i*3] == 0 && old_texture[i*3+1] == 0 && old_texture[i*3+2] == 0) ? 0 : 255;


Takhle budeš mít průhledné místa, kde je černá barva a ne fialová.
_________________
AMD Open Source Graphics Driver Developer


Naposledy upravil Marek dne 7. únor 2008, 22:07:41, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3, 4  Další
Strana 3 z 4

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna