Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

'Culling' in een voxelwereld

Pagina: 1
Acties:

  • windwarrior
  • Registratie: Januari 2009
  • Laatst online: 12-07-2024

windwarrior

ʍıupʍɐɹɹıoɹ

Topicstarter
Hey,

Ik ben al enige tijd bezig met een voxelengine in javascript/three.js (WebGl dus).

Laat ik beginnen bij het begin, ik heb een wereld die arbitraire grootte (maar niet oneindig!) heeft, maar laten we aannemen dat hij in het videomemory past. Voor het voorbeeld hieronder is het geloof ik 320*320*96 voxels. Uit gameplay overwegingen wil ik het beeld van een speler beperken tot (bijvoorbeeld) 128*128*96. Daartoe wil ik eigenlijk dat de camera slechts een deel van de wereld laat zien, en dat ik eenvoudig aan kan geven waar de wereld 'geculled' wordt. De camera wil ik dan kunnen bewegen door mijn wereld, en daarmee dus andere delen van de wereld tonen.

Hieronder staat een voorbeeld van wat ik bedoel, het witte gedeelte van de wereld wil ik wel zien, het groene niet.

Ik heb het geprobeerd met de near/far van de camera, maar gezien die schuin boven het beeld hangt wordt dan ook mijn wereld schuin afgesneden, dat is niet mijn bedoeling.

Afbeeldingslocatie: http://i.imgur.com/6oge9SZ.png

Verder zitten er self-shadowing issues in, maar dat is voor latere zorg O-)

[ Voor 4% gewijzigd door windwarrior op 23-04-2014 19:47 ]


  • HuHu
  • Registratie: Maart 2005
  • Niet online
En wat is nu je vraag?

  • windwarrior
  • Registratie: Januari 2009
  • Laatst online: 12-07-2024

windwarrior

ʍıupʍɐɹɹıoɹ

Topicstarter
Welke webgl/three.js functies ik moet hebben om *alleen* het witte gedeelte zichtbaar te hebben.

Zegmaar op een zelfde manier als een camera tot een bepaalde plan rendert wil ik aan kunnen geven alleen het witte gedeelte zichtbaar te hebben.

Ik hoop dat het daar iets duidelijker door is :), overigens, als ik op de verkeerde weg zit wil ik dat ook graag weten :).

[ Voor 20% gewijzigd door windwarrior op 24-04-2014 12:44 ]


  • Caelorum
  • Registratie: April 2005
  • Laatst online: 14:02
Volgens mij zit in WebGL2 wel occlusion query api., maar is dit afwezig in WebGL1. Als dat zo is zou je dit kunnen gebruiken: https://www.khronos.org/o...3/html/glBeginQuery.xhtml
Zie -> https://plus.google.com/+RomainGuy/posts/DgemC8aa7qH
Aan de hand van het resultaat kan je dan bepalen om een object wel of niet te tekenen.

[ Voor 14% gewijzigd door Caelorum op 24-04-2014 12:51 ]


  • windwarrior
  • Registratie: Januari 2009
  • Laatst online: 12-07-2024

windwarrior

ʍıupʍɐɹɹıoɹ

Topicstarter
Interessant, maar denk ik niet wat ik zoek. De hele voxelwereld is een enkele mesh, ik wil dus ook halverwege een mesh kunnen snijden op dezelfde manier als fustrum culling werkt (voor camera's). Eigenlijk zoek ik naar een manier om mijn wereld te kunnen renderen zoals dat ook gebeurd in voxatron

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Waarschijnlijk is dit het makkelijkste te doen met custom clip planes als je maar 1 enkele mesh hebt.

Wat je normaal zou doen is een cube instanced tekenen voor iedere voxel en dan heb je een stuk meer controle over wat er gerendered word.

  • Xalephsis
  • Registratie: Augustus 2009
  • Laatst online: 28-05 15:40
En een hele berg overhead + draw calls..

Ik snap alleen niet dat je z near en z far niet werken? Dat is gewoon hard coded toch? Wat je eventueel kunt doen is een eigen variatie maken op je SCENE object en daar een extra sorteer functie maken die alle voxels in je mesh opslaat die je wilt renderen en dat dit de lijst wordt die je uiteindelijk gaat renderen. Ik weet niet in hoeverre Three.js dat toe laat maar dat moet vast wel mogelijk zijn.

Anders kun je kijken naar een "alternatieve" implementatie op LoD misschien?

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Xalephsis schreef op zondag 27 april 2014 @ 00:38:
En een hele berg overhead + draw calls..
Je kunt al die voxels gewoon in 1 draw-call renderen met Draw(Indexed)Instanced, je zou ze zelfs op de GPU in een compute shader kunnen generaten met DrawInstancedIndirect. (Hetzelfde geld voor OpenGL, ARB_draw_indirect en/of glDrawElementsInstanced).

WebGL heeft ANGLE_instanced_arrays.

[ Voor 4% gewijzigd door PrisonerOfPain op 27-04-2014 11:57 ]


  • windwarrior
  • Registratie: Januari 2009
  • Laatst online: 12-07-2024

windwarrior

ʍıupʍɐɹɹıoɹ

Topicstarter
Ik zal er eens naar kijken, bedankt!
Pagina: 1