Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Juraj
Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 14. únor 2009, 20:01:02 Předmět: 2D Bitmap |
|
|
Zdravím,
chtěl bych se zeptat jak nejlepe vykreslovat jen nějakou část z 2D obrázků. Jako jeden nápad, mě napadl pomocí effektu, dále jsem četl něco o maskách, ale nějak nevím co a jak.
Potřeby vždy vykreslit část, ale jedná se o nějaký mnohoúhelník.. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 14. únor 2009, 20:12:25 Předmět: |
|
|
Nejako mi, a asi nielen mne, nie je jasne, co tym myslis. Skus upresnit platformu atd... _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Juraj
Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 14. únor 2009, 20:28:12 Předmět: |
|
|
Mám prostě celý obrátek ukazatele života. Potřebuji vždy vykreslit jen část podle toho kolik bude mít daný hráč hp. Ale potřebuji vykreslovat jen čast ovšem do elipsy, nikoliv do čtverce.. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 14. únor 2009, 20:37:23 Předmět: |
|
|
Asi napriklad maskou, napriklad stencilovou...
http://www.opengl.org/wiki/Stencil_Mask
Priblizny postup:
Zapnes zapis do stencil buffera
Vykreslis masku (elipsu), tj tam kde je elipsa budu jednotky, inde nuly
Zapnes stencil test tak, aby sa vykreslili len pixely, kde je stencil 1
Vykreslis tvoj obdlznik ([left,top],[health_percent*width,height]) na miesto elipsy
Vypnes stencil test
Tak isto by sa to malo dat spravit aj s depth bufferom. Kod pre Microsoft si musis dohladat.
Edit: Netusim, ci chces OpenGL, DirectX, x86 ASM, uplne vseobecne riesenie alebo nieco ine, tak som si vybral OpenGL _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Naposledy upravil pcmaster dne 14. únor 2009, 21:05:50, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 14. únor 2009, 21:01:12 Předmět: |
|
|
Šlo by to udělat i alpha testem nebo s blendingem, pokud si předgeneruješ alpha kanál. A dokonce i procedurálně (tzn. bez textury) v shaderu, pokud se tvar toho ukazatele dá popsat matematicky (tzn. kruhem nebo elipsou). V podstatě se dá použít cokoliv, kde je možnost zahazovat pixely.
BTW neviděl jsem nikde, že se to týká OpenGL, ale vzhledem k sekci se to týká nějakého 3D API asi. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Juraj
Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 14. únor 2009, 21:12:07 Předmět: |
|
|
pcmaster napsal: |
Asi napriklad maskou, napriklad stencilovou...
http://www.opengl.org/wiki/Stencil_Mask
Priblizny postup:
Zapnes zapis do stencil buffera
Vykreslis masku (elipsu), tj tam kde je elipsa budu jednotky, inde nuly
Zapnes stencil test tak, aby sa vykreslili len pixely, kde je stencil 1
Vykreslis tvoj obdlznik ([left,top],[health_percent*width,height]) na miesto elipsy
Vypnes stencil test
Tak isto by sa to malo dat spravit aj s depth bufferom. Kod pre Microsoft si musis dohladat.
Edit: Netusim, ci chces OpenGL, DirectX, x86 ASM, uplne vseobecne riesenie alebo nieco ine, tak som si vybral OpenGL |
Syntaxi si najdu sám, to je nejmenší problém když vím co mám hledat. Díky moc mi to pomohlo |
|
Návrat nahoru |
|
|
Juraj
Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 15. únor 2009, 11:50:51 Předmět: |
|
|
Tak nyní už bych potřeboval trochu poradit i s kodem. Nalezl jsem jen nějaké skoro funkční programy a tohle z nich extrahoval a upravil. Už opravdu nevím co by mitam mohlo chybět..
kód: |
//Enable the stencil
GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.None;
GraphicsDevice.RenderState.StencilEnable = true;
GraphicsDevice.RenderState.StencilFunction = CompareFunction.Always;
GraphicsDevice.RenderState.StencilPass = StencilOperation.Replace;
GraphicsDevice.RenderState.StencilFail = StencilOperation.Keep;
GraphicsDevice.RenderState.ReferenceStencil = 1;
Vector2[] v = new Vector2[] { new Vector2(0, 0), new Vector2(0, 100), new Vector2(100, 100), new Vector2(100, 0) };
//Render a square to it to use it as the buffer. Is this right?
RenderPolygon(v, 100, 100, 0, 0, 0);
//Then turn off the stencil I guess....
GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.All;
GraphicsDevice.RenderState.StencilEnable = true;
GraphicsDevice.RenderState.ReferenceStencil = 1;
GraphicsDevice.RenderState.StencilFunction = CompareFunction.Equal;
GraphicsDevice.RenderState.StencilPass = StencilOperation.Keep;
//Render the texture I want to get stenciled. It should just draw it in the triangle region, but it doesn't
RenderTexture(this.tx2d, 0, 0, 0, 0, 0); |
|
|
Návrat nahoru |
|
|
Juraj
Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 16. únor 2009, 18:16:25 Předmět: |
|
|
Vyřešeno, chýbělo mi
kód: |
....graphicsDeviceManager.PreferredDepthStencilFormat = DepthFormat.Depth24; |
takovou hloupost a tolik času
ps: třeba to někomu pmůže |
|
Návrat nahoru |
|
|
|