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
|
Zaslal: 4. únor 2008, 17:29:42 Předmět: |
|
|
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 |
|
 |
Standalf

Založen: 29. 01. 2008 Příspěvky: 32 Bydliště: Děčín
|
Zaslal: 4. únor 2008, 20:24:44 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 5. únor 2008, 12:10:19 Předmět: |
|
|
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 |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 5. únor 2008, 12:13:28 Předmět: |
|
|
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  |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 5. únor 2008, 16:25:31 Předmět: |
|
|
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 |
|
 |
Standalf

Založen: 29. 01. 2008 Příspěvky: 32 Bydliště: Děčín
|
Zaslal: 5. únor 2008, 17:03:40 Předmět: |
|
|
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 |
|
 |
Standalf

Založen: 29. 01. 2008 Příspěvky: 32 Bydliště: Děčín
|
Zaslal: 5. únor 2008, 17:24:04 Předmět: |
|
|
A jak muzu dosahnout nepruhlednosti pri prejizdeni kosticky s blendingem?
Diky |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 5. únor 2008, 17:39:55 Předmět: |
|
|
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 |
|
 |
Standalf

Založen: 29. 01. 2008 Příspěvky: 32 Bydliště: Děčín
|
Zaslal: 5. únor 2008, 17:52:36 Předmět: |
|
|
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 |
|
 |
Kaemon
Založen: 28. 07. 2007 Příspěvky: 33
|
Zaslal: 5. únor 2008, 18:42:22 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 6. únor 2008, 04:44:51 Předmět: |
|
|
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 |
|
 |
Standalf

Založen: 29. 01. 2008 Příspěvky: 32 Bydliště: Děčín
|
Zaslal: 6. únor 2008, 15:35:38 Předmět: |
|
|
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  |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
|
Návrat nahoru |
|
 |
Standalf

Založen: 29. 01. 2008 Příspěvky: 32 Bydliště: Děčín
|
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. únor 2008, 22:02:18 Předmět: |
|
|
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 |
|
 |
|