.[ ČeskéHry.cz ].
8 bit textury s paletou v opengl?
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
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

PříspěvekZaslal: 13. září 2009, 11:41:41    Předmět: 8 bit textury s paletou v opengl? Odpovědět s citátem

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 Smile

Děkuji za odpověd. Rolling Eyes
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
frca



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

PříspěvekZaslal: 13. září 2009, 11:51:54    Předmět: Odpovědět s citátem

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
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: 13. září 2009, 12:16:49    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 13. září 2009, 12:53:23    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 13. září 2009, 13:31:57    Předmět: Odpovědět s citátem

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 Wink.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 13. září 2009, 13:38:47    Předmět: Odpovědět s citátem

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 Smile 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 Smile 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 Smile
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: 13. září 2009, 14:28:15    Předmět: Odpovědět s citátem

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
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: 13. září 2009, 14:31:08    Předmět: Odpovědět s citátem

BTW o jakou hru jde a proč to nenecháš v ddraw, když to tam funguje?
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 13. září 2009, 14:51:08    Předmět: Odpovědět s citátem

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 Smile 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
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: 13. září 2009, 15:00:28    Předmět: Odpovědět s citátem

Tohle si projdi: http://www.lighthouse3d.com/opengl/glsl/
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 13. září 2009, 15:08:38    Předmět: Odpovědět s citátem

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ě. Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 13. září 2009, 15:18:18    Předmět: Odpovědět s citátem

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ě. Wink

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 13. září 2009, 15:24:17    Předmět: Odpovědět s citátem

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ě. Wink

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 13. září 2009, 15:24:49    Předmět: Odpovědět s citátem

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ě. Wink

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í Smile a ještě jsi opravil ten příklad, díky moc.
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: 13. září 2009, 17:13:21    Předmět: Odpovědět s citátem

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
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 -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
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