Forum » Programiranje » [C# HLSL] osnovna uporaba pixel shaderja
[C# HLSL] osnovna uporaba pixel shaderja
spelic ::
A mogoče ve kdo kako bi napisal preprost pixel shader v katerega bi bili vhodi
- textura
- matrika
vrnil pa bi spremenjeno texturo.
Primer si lahko predstavljate kot filter za slike. npr. vnesemo texturo s sliko in matriko za blur ali ... in na zaslon ali v texturo dobilo
rezultat filtra.
Največji problem mi predstavlja kako mu povedati naj mi rezultat shrani v texturo in kako jo uporabiti.
A se da narediti tudi kakšen pixel shader, ki ni nujno zagnan preko EFFECT-a.
Hvala za pomoč
- textura
- matrika
vrnil pa bi spremenjeno texturo.
Primer si lahko predstavljate kot filter za slike. npr. vnesemo texturo s sliko in matriko za blur ali ... in na zaslon ali v texturo dobilo
rezultat filtra.
Največji problem mi predstavlja kako mu povedati naj mi rezultat shrani v texturo in kako jo uporabiti.
A se da narediti tudi kakšen pixel shader, ki ni nujno zagnan preko EFFECT-a.
Hvala za pomoč
Senitel ::
Posamezne shaderje lahko prevajaš s pomočjo EffectCompiler.CompileShader, ki ti vrne GraphicsStream, ki ga potem uporabiš v konstruktorju PixelShader ali VertexShader objekta. To potem nastaviš pod PixelShader ali VertexShader property v Device objektu. No pri CompileShader moraš seveda povedat katero funkcijo naj ti prevede in katero verzijo shaderja naj uporabi.
Za drugo zadevo pa potrebuješ "render to texture" funkcionalnost... To narediš tako, da kreiraš novo 2D teksturo, ki jo postaviš v "Default" pool in ima usage "RenderTarget" ter je v formatu v katerega zna grafična renderirat (Texture rt = new Texture(Device, 512, 512, 1, RenderTarget, A8R8G8B8,Default);). Ne moreš recimo renderirat DXT formate... Poleg tega moraš naredit še en depth stencil surface (Device.CreateDepthStencilSurface), ki ima iste dimenzije kot omenjena tekstura.
Sedaj nastaviš svoj shader, nastaviš konstne, ki jih potrebuješ v shaderju, nastaviš teksture... Ob tem si pa moraš najprej zapomnit svojo trenutno "render target" (Device.GetRenderTarget in Device.DepthStencilSurface property). Ko imaš to shranjeno lahko takoj nastaviš DepthStencilSurface na zgoraj kreiran buffer, za render target pa moraš najprej dobit zgornji surface (eventuelno pač katerega hočeš, če imaš mip mapping), Texture.GetSurfaceLevel(0) in potem ta surface nastaviš z Device.SetRenderTarget(0, surface) in izrišeš kar ti pač paše. SetRenderTarget sprejme tudi index, ker lahko iz pixel shaderja hkrati rišeš v 4 različne bufferje (ki pa morajo biti istih dimenzij in istega formata).
Ko imaš to narejeno veselo Dispose-aš surface, ki ga imaš za render target. Nastaviš prvotna bufferja nazaj. Potem pa izrišeš kar ti paše še na zaslon (in pri tem lahko uporabiš uno teksturo, ki si jo renderiral prej).
Upam da pomaga.
Za drugo zadevo pa potrebuješ "render to texture" funkcionalnost... To narediš tako, da kreiraš novo 2D teksturo, ki jo postaviš v "Default" pool in ima usage "RenderTarget" ter je v formatu v katerega zna grafična renderirat (Texture rt = new Texture(Device, 512, 512, 1, RenderTarget, A8R8G8B8,Default);). Ne moreš recimo renderirat DXT formate... Poleg tega moraš naredit še en depth stencil surface (Device.CreateDepthStencilSurface), ki ima iste dimenzije kot omenjena tekstura.
Sedaj nastaviš svoj shader, nastaviš konstne, ki jih potrebuješ v shaderju, nastaviš teksture... Ob tem si pa moraš najprej zapomnit svojo trenutno "render target" (Device.GetRenderTarget in Device.DepthStencilSurface property). Ko imaš to shranjeno lahko takoj nastaviš DepthStencilSurface na zgoraj kreiran buffer, za render target pa moraš najprej dobit zgornji surface (eventuelno pač katerega hočeš, če imaš mip mapping), Texture.GetSurfaceLevel(0) in potem ta surface nastaviš z Device.SetRenderTarget(0, surface) in izrišeš kar ti pač paše. SetRenderTarget sprejme tudi index, ker lahko iz pixel shaderja hkrati rišeš v 4 različne bufferje (ki pa morajo biti istih dimenzij in istega formata).
Ko imaš to narejeno veselo Dispose-aš surface, ki ga imaš za render target. Nastaviš prvotna bufferja nazaj. Potem pa izrišeš kar ti paše še na zaslon (in pri tem lahko uporabiš uno teksturo, ki si jo renderiral prej).
Upam da pomaga.
spelic ::
Hvala, lepo razloženo.
Sem pa najdel tudi en dober link, če se še kdo ukvarja z podobnimi stvarmi.
http://www.riemers.net/eng/Tutorials/Di...
Imam pa problem, ker v vs2005 nikakor ne uspem usposobiti hlsl debug-iranja.
A mogoče veš v čem je fora.
Hvala
Sem pa najdel tudi en dober link, če se še kdo ukvarja z podobnimi stvarmi.
http://www.riemers.net/eng/Tutorials/Di...
Imam pa problem, ker v vs2005 nikakor ne uspem usposobiti hlsl debug-iranja.
A mogoče veš v čem je fora.
Hvala
Senitel ::
No... Predvidevam da si SDK naložil z vsemi extension-i za VS... Sedaj greš najprej tja kamor si SDK inštaliral in v Utilities\Bin\x86 poženeš dxcpl.exe in vklopiš enable shader debuging in zgoraj preklopiš iz retail na debug runtime. Nujno moraš svoj device kreirat kot DeviceType.Reference in zelo priporočljivo da svoje shaderje/efekte prevedeš z Debug in SkipOptimization zastavicami (sicer ti lahko compiler ukaze preuredi do nerazpoznavnosti). Sedaj samo še poženeš zadevo tako da greš pod Debug -> Direct3D -> Start with Direct3D Debugging in program se ti bo vstavil v shaderju, kjer imaš pač breakpointe postavljene.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | problemi pri igri gta ivOddelek: Igre | 2171 (1145) | MasterTade |
» | ATI Hemlock že novembra? (strani: 1 2 )Oddelek: Novice / Grafične kartice | 9848 (7148) | Machiavelli |
» | Nov članek: DirectX 11Oddelek: Novice / Nova vsebina | 5591 (3185) | Senitel |
» | C#,HLSL, 3D textureOddelek: Programiranje | 1056 (949) | spelic |