Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 24. červen 2014, 11:13:03 Předmět: Render to texture a zároveň čtení (DirectX/OpenGL) |
|
|
Jednoduchý dotaz: Lze principielně i prakticky renderovat do textury a zároveň z ní číst? Co například zabrání nabindovat a použít texturu, do které se zároveň v tu chvíli renderuje přes FBO/MRT?
Díky. _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 24. červen 2014, 11:31:27 Předmět: |
|
|
Teoreticky to jde, prakticky ne. Jediné kde to tak nějak jde, je na iOS a používat to pro uživatelsky kontrolovaný blending. Čtu původně zapsaný pixel a na stejné místo zapisuju nový.
Obecně neexistuje způsob jak zajistit, zda ten pixel byl již zapsán, nebo je tam ještě stará hodnota. Navíc to sice nabindovat myslím jde, ale sype to warningy, popř. je to nedefinovaé chování.
Ale na 100% to nevím Možná se něco s posledními drivery / sdk změnilo. _________________ Perry.cz |
|
Návrat nahoru |
|
|
micky
Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 24. červen 2014, 19:18:43 Předmět: |
|
|
v nejakom tutorialy k FBO som cital ze to dokaze zhodit MacOS.
myslim ze jedina moznost je implementovat vsetko rucne cez image load store http://www.opengl.org/wiki/Image_Load_Store _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
micky
Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 24. červen 2014, 19:47:48 Předmět: |
|
|
nou napsal: |
rucne cez image load store |
To by asi šlo, ale trochu bych se bál poklesu výkonu (dokážu využít cache stejně dobře, jako když se čte/zapisuje "by default"?). Nebo se pletu? _________________ https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/ |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 25. červen 2014, 09:25:58 Předmět: |
|
|
A na co by to bylo dobré? Nějaký technologický špek? Já bych volil dvě textury a přistupoval k tomu jako k double bufferu.
nou: (OT) MacOS je možná trochu citlivej...občas se mi sesypal grafický výstup, ale ne nějaká "modrá obrazovka" s nápisem, nýbrž barevný šum. Jako v televizi bez signálu. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 25. červen 2014, 11:42:38 Předmět: |
|
|
Samozrejme to ide pomocou compute shaderov, ktore su sucastou OpenGL i DirectX, Cuda ci OpenCL. Uz v DX11.0 s feature level 10_0 to ide, staci pouzit UAV. A mas Read-Write (RW) texturu a mozes zapisovat co chces, kam chces a citat, co chces, kam chces. K tomu atomicke operacie. Samozrejme ale z compute shaderu! Taka textura nesmie byt render target.
V DX11.1 uz mozes mat RW texturu i RW buffer z ktorehokolvek shader stagu (napriklad vertex, hull alebo compute i pixel), ale samozrejme nesmie to byt render target. V DX11.0 mas UAV len v pixel a compute.
Zalezi, co chces dosiahnut, predsalen DX11.1 nemas na mnoho zariadeniach Nemozem odporucit, aby si sa tomu vyhol pri vyskume, ale mozem odporucit, aby si sa tomu vyhol, ak to chces na realne pouzitie. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 25. červen 2014, 11:46:58 Předmět: |
|
|
O cache by som sa nebal, ta si s tym hravo poradi. Horsia je logicka spravnost a thread safety. Ano, GPU thread safety. Ak ti bude jeden thread zapisovat bajty na nejakej nahodnej adrese a druhy ti z nej bude citat, musis si to osetrit, inak tam mas RAW hazard. Od toho atomicke operacie na GPU. Ale je to obmedzene trochu Kazdopadne toto sa nijako nelisi od bezneho paralelneho programovania na CPU
Urcite to nie je vo vseobecnosti dobry napad a vratil by som sa k nejakemu double buffer ping-pongu a synchronizoval na CPU. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Peto
Založen: 01. 08. 2007 Příspěvky: 206 Bydliště: Košice
|
Zaslal: 26. červen 2014, 07:20:50 Předmět: |
|
|
Ja to pouzivam na tienovanie mrakov.. niesom si isty myslim ze sa to vola (resp bol sampel na to) Dobashi clouds.. tam treba zaroven renderov ale po kazdom rendery jednotliveho mraku (jeho fragmentu).. citat z tejto textury..
D3D9:
Co sa tyka rychlosti je to tak na hranici pouzitelnosti v realnom case.. tj ked toho nemas vela (par desiatok citani/pixelov).. okej.. ale ked mas toho viac.. realtime sa to pouzit neda..
g_pD3DDevice->GetRenderTargetData()
tato funkcia vie prekopirovat z textury D3DPOOL_DEFAULT (do ktorej kopirujes render target).. do textury D3DPOOL_SYSTEMMEM .. z ktorej sa da potocim citat normalne cez LockRect()
Musim ale povedat ze u mna maju tieto textury velkost 1x1 .. lebo potrebujem za kazdym len jeden pixel... cize kopirujem cez
g_pD3DDevice->StretchRect
z velkej render target textury (D3DPOOL_DEFAULT) do malej 1x1... s tym ze specifikujem RECT areu iba jeden pixel _________________ Code or die!
|
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 21. srpen 2014, 19:40:19 Předmět: |
|
|
Jde to a v OpenGL je na to funkce glTextureBarrier() (ARB_texture_barrier, GL 4.5), případně glTextureBarrierNV() (NV_texture_barrier). Je to přímo dělané na programovatelný blending. Můžeš to použít jedině tak, že ten pixel, který se počítá, můžeš v pixel shaderu číst a během renderingu můžeš zapsat každý pixel maximálně jednou.
Na úrovni ovladače je ta funkce řešená dost primitivně - glTextureBarrier() prostě vyprázdní cache framebufferu a textur, aby následný rendering mohl číst z textury, do které framebuffer zapisoval. Když se to neudělá, tak bys mohl číst akorát starší data, protože ta nová mohou být v cachi framebufferu / nezapsaná. Vypráznění cache je docela drahé, takže bych to moc nehrotil. Na složitější věci je lepší použít Image Load/Store, UAV atd. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
joeblack
Založen: 14. 09. 2009 Příspěvky: 66
|
Zaslal: 25. srpen 2014, 15:31:22 Předmět: |
|
|
Na DX11 (o 11.1 neviem) to urcite nefunguje.
Ak nastavis resource ako texturu aj render target tak texturu forcn-e na NULL.
S debug device aj vypise hlasku. |
|
Návrat nahoru |
|
|
|