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: 1. leden 2012, 00:11:12 Předmět: GLSL - Barevný klíč? |
|
|
Zdravím,
je možné přes GLSL přepsat jen určité pixely podle zvolené barvy? Vím že gl_FragColor je jen pro zápis (a posléze i čtení), ale jak získat tu původní barvu pixelu? Z GLSL přeci framebuffer číst nejde, ne?
Renderuju do textůry, a potřeboval bych právě přepsat jen některé pixely, podle barvy, něco jako stencil...
Díky moc.
PS: Šťastný nový rok 2012  _________________
 |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 1. leden 2012, 02:05:02 Předmět: |
|
|
no asi by to aj slo. ale potrebujes OpenGL 4.2 alebo teda DX11 kartu. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 1. leden 2012, 03:54:05 Předmět: |
|
|
Aha, ale já si zatím vystačím s verzí 2.1 Taky chci aby to běželo na starších mašinách, takže to nepřipadá v úvahu. A nějaká jiná možnost tu není?
Asi hloupá otázka, ale nešlo by třeba "nějak" tu texturu (do které renderuju) přiřadit některému sampleru?  _________________
 |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 1. leden 2012, 09:47:07 Předmět: |
|
|
Tohle řeším přes dvě textury... jedna aktivní (kam se renderuje) a druhá neaktivní (odkud se čte)... pokaždé překopíruju neaktivní do aktivní, s tím že udělám změny podle toho, co chci.. pak přehodím pointery aktivní / neaktivní a jedu znova.
Bindovat texturu do které se píše jako sampler myslím jde ve smyslu že to nespadne, ale výsledek není zaručen. Tzn. může se to chovat různě _________________ Perry.cz |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 1. leden 2012, 17:45:49 Předmět: |
|
|
A co použít ten stencil? (Za předpokladu že můžeš mít Depth-Stencil depth buffer v render targetu)
1. Vymaž stencil na 0 a nekresli do color bufferu
2. Nabinduj pixel shader, který na barvách neprošlých podmínkou provede texkill (discard)
3. Vykresli fullscreen quad a zvedni stencil na 1 pouze tam kde projde (e.g. tedy kde se vykreslí pixel)
4. Teď začni kreslit do color bufferu
5. Nabinduj tvůj shader a pouze kde je stencil = 1 vykresli co chceš
Mělo by to takto fungovat (možná jsem někde na něco zapomněl - psal jsem to v rychlosti).
Jinak ideálně bys to mohl udělat asi přes OpenCL (kde by to bylo velmi snadné) - ale předpokládám že neplánuješ podporu OpenCL. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 1. leden 2012, 23:49:56 Předmět: |
|
|
perry napsal: |
Bindovat texturu do které se píše jako sampler myslím jde ve smyslu že to nespadne, ale výsledek není zaručen. Tzn. může se to chovat různě |
Jde to za pomoci GL_NV_texture_barrier. Podle mě je to na tento případ přesně určené. Dá se pomocí toho udělat i blending v shaderu...
Samozřejmě i bez toho je možno předpovědět, kdy to bude/nebude fungovat. Zejména při nabindování FBO první kreslící operace vůbec nepotřebuje texture barrier, pokud se každý pixel zapíše jen jednou a na odpovídajících pozicích. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 2. leden 2012, 04:42:52 Předmět: |
|
|
perry: Těch textůr můžu mít i stovky, a kopírováním skoro každé textůry v jednom snímku bych to akorád pohřbil
Vilem Otte: To je dobrý nápad, tak bych to mohl i udělat, jen nevím jestli většině bude karta podporovat GL_DEPTH24_STENCIL8_EXT. Budu to muset asi risknout... A OpenCL se mi používat zatím nechce, dělám totiž standalone knihovnu, bez jakýchkoliv prerequisites. A ještě k tomu jsem si zatím na OpenCL moc nešáhnul
Marek: O tom rozšíření vím, ale bohužel ho moje karta nepodporuje, takže to nebudu ani zkoušet.
Myslíš že bych to mohl udělat i bez té bariery? Potřebuju ve shaderu přečíst z fbo pixel který se bude přepisovat, a podle jeho barvy ho buď přepíšu a nebo discardnu.
Budu vlastně jen jednou číst a jen jednou zapisovat. Je to velice jednoduchý shader, a jen jeden průchod.
Zkusím to, a dám vědět...  _________________
 |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 2. leden 2012, 05:39:35 Předmět: |
|
|
Zdá se že to běží bez problémů, doufám jen že to není nějaká haluz u mojí karty. Při nejhorším, když to bude dělat problémy, zkusím tu metodu s použitím stencil bufferu.
Takže díky všem moc za pomoc  _________________
 |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 2. leden 2012, 13:01:25 Předmět: |
|
|
Jo, bude to fungovat i bez bariéry. Ovšem doporučuju udělat maximálně jednu kreslící operaci, když je to nabindovaný zároveň jako framebuffer a textura.
OpenGL ve skutečnosti nedefinuje, jak se to má chovat, ale někteří moc dobře víme, jak to pod kapotou chodí.
Ta texturová bariéra dělá akorát to, že vyprázdní texturovou cache a cache framebufferu, aby následující kreslící operace četla přímo z paměti a ne z cache. Kdyby tam ta bariéra nebyla, mohlo by se stát, že při čtení textury v druhém průchodu bys dostal pixely ještě ze stavu před prvním průchodem (protože by od té doby zůstaly v texturové cache). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
|