.[ ČeskéHry.cz ].
Render to texture a zároveň čtení (DirectX/OpenGL)

 
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
frca



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

PříspěvekZaslal: 24. červen 2014, 11:13:03    Předmět: Render to texture a zároveň čtení (DirectX/OpenGL) Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 24. červen 2014, 11:31:27    Předmět: Odpovědět s citátem

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 Wink Možná se něco s posledními drivery / sdk změnilo.
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 24. červen 2014, 18:48:43    Předmět: Odpovědět s citátem

citace:
Normally, you should not sample a texture and render to that same texture at the same time. This would give you undefined behavior. It might work on some GPUs and with some driver version but not others.
viz: http://www.opengl.org/wiki/GLSL_:_common_mistakes#Sampling_and_Rendering_to_the_Same_Texture

OpenGL se k tomu staví stylem "chování není definováno". Počítám, že tam, kde to funguje, se udržuje nějaká lokální kopie právě rasterizovaného bloku.

Nevím, možná je v OpenGL 4.4 nebo DirectX 11.1 způsob, jak to zvládnout bezpečně, ale jistější cesta bude použít dvě textury a střídat je jako target/source.
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 24. červen 2014, 19:18:43    Předmět: Odpovědět s citátem

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



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 24. červen 2014, 19:47:48    Předmět: Odpovědět s citátem

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



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 25. červen 2014, 09:25:58    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 25. červen 2014, 11:42:38    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 25. červen 2014, 11:46:58    Předmět: Odpovědět s citátem

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 Sad Kazdopadne toto sa nijako nelisi od bezneho paralelneho programovania na CPU Smile

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



Založen: 01. 08. 2007
Příspěvky: 206
Bydliště: Košice

PříspěvekZaslal: 26. červen 2014, 07:20:50    Předmět: Odpovědět s citátem

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 Smile.. 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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 21. srpen 2014, 19:40:19    Předmět: Odpovědět s citátem

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



Založen: 14. 09. 2009
Příspěvky: 66

PříspěvekZaslal: 25. srpen 2014, 15:31:22    Předmět: Odpovědět s citátem

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
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
Strana 1 z 1

 
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