Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 13. září 2009, 11:41:41 Předmět: 8 bit textury s paletou v opengl? |
|
|
Dobrý den,
Chtěl bych se zeptat jestli víte o nějakém způsobu jak opengl donutit používat 8 bitové textůry, mám totiž kolem 800MB souborů v 8 bitové kvalitě, kde každý soubor může mít až 4 palety (formát jedné hry), takže převádění do 32 bit RGBA formátu nepřipadá v úvahu (i když jsem to už implementoval).
Přes GLEW jsem zkontroloval podporu GL_ARB_imaging, kde je funkce glColorTable, a bohužel tuto funkci nemám (ATIX1800) protože GLEW hlásí missing. Podporu pro GL_EXT_paletted_texture to taky nenašlo.
Jiný způsob jsem nenašel, proto bych se chtěl zeptat těch zkušenějších tady
Děkuji za odpověd.  |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 13. září 2009, 11:51:54 Předmět: |
|
|
Od palet se v moderních GK upouští, takže podporu v kartě asi nemáš a čím novější karta, tím menší pravděpodobnost, že bude palety podporovat. Každopádně těch 800 MB textur se využívá najednou? _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 13. září 2009, 12:16:49 Předmět: |
|
|
Použít S3TC kompresi tj. GL_COMPRESSED_RGB(A)_S3TC_DXT1_EXT. Bacha, na alpha kanál tady máš jen jeden 1 bit, což by ale mělo stačit. Komprese má poměr 1:8.
Když převedeš textury do RGB, máš 800*3=2400MB, po kompresi pak 2400/8=300MB. Lepší?
Dále, není lepší si ty textury načítat za běhu z disku a mít v paměti jen to, co se právě kreslí? V podstatě budeš používat video RAM jako cache, zatímco hlavní úložiště dat budeš mít především na disku. Dnešní disky dají 30MB/s a víc, což by neměl být moc problém. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 13. září 2009, 12:53:23 Předmět: |
|
|
alebo nacitat textury iba v tom 8 bit. a potom mat lookup 1D texturu s paletou. na to ale treba shadery. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 13. září 2009, 13:31:57 Předmět: |
|
|
Pokud vím, všechny staré hry v době, kdy měly podporu sw renderingu, měly 8bitové textury. Můžeš si např. stáhnout zdroják Quake 2 a podívat se.
Dá se to udělat třeba takhle (viz tohle vlákno):
kód: |
glEnable(GL_TEXTURE_2D);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glBindTexture(GL_TEXTURE_2D, texID);
glColorTableEXT(GL_TEXTURE_2D, GL_RGBA8, 256, GL_RGBA, GL_UNSIGNED_BYTE, palette);
glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, width, height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, texture); |
Ostatní řešení nejsou dostupná všude (např. GL_EXT_paletted_texture je jen na některých NVidiích).
BTW hrozně se mi líbí odpovědi typu "na co to potřebuješ", "to už se dneska nepoužívá" nebo obcházející řešení, které kvůli kompresi zprzní původní obrázek . _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 13. září 2009, 13:38:47 Předmět: |
|
|
Eosie napsal: |
Použít S3TC kompresi tj. GL_COMPRESSED_RGB(A)_S3TC_DXT1_EXT. Bacha, na alpha kanál tady máš jen jeden 1 bit, což by ale mělo stačit. Komprese má poměr 1:8.
Když převedeš textury do RGB, máš 800*3=2400MB, po kompresi pak 2400/8=300MB. Lepší?
Dále, není lepší si ty textury načítat za běhu z disku a mít v paměti jen to, co se právě kreslí? V podstatě budeš používat video RAM jako cache, zatímco hlavní úložiště dat budeš mít především na disku. Dnešní disky dají 30MB/s a víc, což by neměl být moc problém. |
Jenže každý ten soubor má 4 palety takže 300 * 4 =1200MB, plus ta paleta je RGBA takže 32 bit, takže ((800 * 4) / 4) * 4) = 3200MB. Musel bych použít DXT5. A to nepočítám ještě to že rozlišení těch textůr musí být mocninou dvou, takže po převodu to může být i 6400MB protože ty soubory jsou dělané pro 2D hru, kde se vykreslovalo přes ddraw, takže ani jeden nemá tuto podmínku splněnou.
O DXT komresi vím, dělal jsem vlastní knihovnu a funkce jsem napsal v assembleru, dekódování 8192x8192 < 600 msec Ale já DXT nechci použít, právě pro chybovost v barvách, protože už tak ty 8 bitové obrázky hodně ztrátové při barevnějších kombinacích.
Samozřejmě že všechny ty textůry v paměti mít nepotřebuji, udělal jsem si cache pro sprajty, a manager pro textury, takže nenačítám jeden soubor více než jednou, problém je ten že potřebuji vykreslit hodně sprajtů v jednom snímku -> dlaždice, stěny, střechy, scenérie, npc, pc atd.
Doufal jsem že kdybych použil 8 bitové textůry místo 32 bitových, docílím menšího swapování textůr, no takže nakonec asi zůstanu u těch 32 bitech a zkusím je načítat až za běhu, jak jsi doporučil  |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 13. září 2009, 14:28:15 Předmět: |
|
|
Ne, jeb na to. Zkus tohle:
Doporučuju to udělat přes ty shadery a 1D 256x1 "rectangle" GL_INTENSITY texturu (ARB_texture_rectangle), kterou použiješ jako lookup tabulku. Vezmeš si vždy vzorek X z textury, spočteš floor(X*255.9) a dosadíš to jako koordináty palety.
Proč 255.9 a ne 255? Kvůli floating-point zaokrouhlování.
Celé by to mohlo v GLSL vypadat nějak takto:
kód: |
gl_FragColor = texture1D(palette, floor(texture2D(myTexture, textureCoordinates).x * 255.9)); |
_________________ AMD Open Source Graphics Driver Developer
Naposledy upravil Marek dne 13. září 2009, 14:32:27, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 13. září 2009, 14:31:08 Předmět: |
|
|
BTW o jakou hru jde a proč to nenecháš v ddraw, když to tam funguje? _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 13. září 2009, 14:51:08 Předmět: |
|
|
Eosie napsal: |
Ne, jeb na to. Zkus tohle:
Doporučuju to udělat přes ty shadery a 1D 256x1 "rectangle" GL_INTENSITY texturu (ARB_texture_rectangle), kterou použiješ jako lookup tabulku. Vezmeš si vždy vzorek X z textury, spočteš floor(X*255.9) a dosadíš to jako koordináty palety.
Proč 255.9 a ne 255? Kvůli floating-point zaokrouhlování.
Celé by to mohlo v GLSL vypadat nějak takto:
kód: |
gl_FragColor = texture1D(palette, floor(texture2D(myTexture, textureCoordinates).x * 255.9)); |
|
Shadery jsou pro mě záhadnou ale zkusím to nějak zprovoznit kouknu se na to... díky.
Eosie napsal: |
BTW o jakou hru jde a proč to nenecháš v ddraw, když to tam funguje? |
Je to hra "Arcanum: Of Steamworks & Magick Obscura"...
Jde o projekt portování té hry na jiné platformy, takže nový engine, původně jsem totiž psal ten engine v Delphi + DirectX, pak přišel ten nápad s jinými platformami, takže jsem to začal přepisovat do C++ a OpenGL.
Stránky projektu: http://arcanum.game-alive.com/ |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
|
Návrat nahoru |
|
 |
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 13. září 2009, 15:08:38 Předmět: |
|
|
Nestačolo by ti si při načítání textur je přepočítat na 32 bitové. Tj. jen každému indexu v datech přiřadíš jeho rgb hodnotu z palety?
Předpokládám že stejně nemáš v plánu nutit OpenGL jet indexovaně.  |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 13. září 2009, 15:18:18 Předmět: |
|
|
Eosie napsal: |
kód: |
gl_FragColor = texture1D(palette, floor(texture2D(myTexture, textureCoordinates).x * 255.9)); |
|
no jo ako keby som to nenavrhol hned prve.
inak nemas tam chybu? preco to vobec nasobis 255.9? ved koordinaty su v OpenGL 0.0-1.0 skor toto
kód: |
gl_FragColor = texture1D(palette, texture2D(myTexture, textureCoordinates).x+1.0/512.0) |
klapauciusk napsal: |
Nestačolo by ti si při načítání textur je přepočítat na 32 bitové. Tj. jen každému indexu v datech přiřadíš jeho rgb hodnotu z palety?
Předpokládám že stejně nemáš v plánu nutit OpenGL jet indexovaně.  |
nie to sa preberalo. ma tych textur prilis vela takze kvoly uspore miesta to chce drzat v 8bitoch. _________________ Najjednoduchšie chyby sa najtažšie hľadajú.
Naposledy upravil nou dne 14. září 2009, 10:03:37, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 13. září 2009, 15:24:17 Předmět: |
|
|
nou napsal: |
klapauciusk napsal: |
Nestačolo by ti si při načítání textur je přepočítat na 32 bitové. Tj. jen každému indexu v datech přiřadíš jeho rgb hodnotu z palety?
Předpokládám že stejně nemáš v plánu nutit OpenGL jet indexovaně.  |
nie to sa preberalo. ma tych textur prilis vela takze kvoly uspore miesta to chce drzat v 8bitoch. |
Myslíš místa v paměti na GPU? Ty tam nahráváš najednou celých 800MB textur? |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 13. září 2009, 15:24:49 Předmět: |
|
|
nou napsal: |
Eosie napsal: |
kód: |
gl_FragColor = texture1D(palette, floor(texture2D(myTexture, textureCoordinates).x * 255.9)); |
|
no jo ako keby som to nenavrhol hned prve.
inak nemas tam chybu? preco to vobec nasobis 255.9? ved koordinaty su v OpenGL 0.0-1.0 skor toto
kód: |
gl_FragColor = texture1D(palette, texture2D(myTexture, textureCoordinates).x+1.0/256.0) |
klapauciusk napsal: |
Nestačolo by ti si při načítání textur je přepočítat na 32 bitové. Tj. jen každému indexu v datech přiřadíš jeho rgb hodnotu z palety?
Předpokládám že stejně nemáš v plánu nutit OpenGL jet indexovaně.  |
nie to sa preberalo. ma tych textur prilis vela takze kvoly uspore miesta to chce drzat v 8bitoch. |
Aha, ted se koukám že jsi to navrhoval jako první a ještě jsi opravil ten příklad, díky moc. |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 13. září 2009, 17:13:21 Předmět: |
|
|
Nouma> Ne tak docela, ten můj původní příklad je (skoro) dobře, viz níže.
nou napsal: |
Eosie napsal: |
kód: |
gl_FragColor = texture1D(palette, floor(texture2D(myTexture, textureCoordinates).x * 255.9)); |
|
no jo ako keby som to nenavrhol hned prve. |
Vím, právě proto jsem napsal "přes ty shadery" (určitý člen -> už to bylo zmíněno) namísto "přes shadery". Ale souhlasím, že jsem tě měl zmínit, sry.
nou napsal: |
inak nemas tam chybu? preco to vobec nasobis 255.9? ved koordinaty su v OpenGL 0.0-1.0 skor toto
kód: |
gl_FragColor = texture1D(palette, texture2D(myTexture, textureCoordinates).x+1.0/256.0) |
|
Zmiňoval jsem ARB_texture_rectangle, kterej bere koordináty v intervalu [0, N-1] namísto [0, 1]. Pro potřeby lookup tabulky mi to přijde vhodnější. Ta extenze je s jistotou všude a je zároveň v GL3.1 core.
Správně je ale:
kód: |
gl_FragColor = texture2DRect(palette, vec2(floor(texture2D(myTexture, textureCoordinates).x * 255.9), 0)); |
_________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
|