Jump to content

  • Log In with Google      Sign In   
  • Create Account


Member Since 30 Jan 2000
Offline Last Active Jul 20 2015 02:30 PM

Posts I've Made

In Topic: CS Honors Project

13 December 2012 - 08:03 PM

How about a Diablo like action RPG? You could do procedural generation of the dungeon layouts, as well as things like the enemies, the loot, and even the textures if you wanted. It also lends itself well to a semi-persistent multiplayer world. I'm not sure if there's anything you could put into the design to really take advantage of parallel programming, aside from moving things like physics and audio processing to their own threads.


In Topic: Don't start yet another voxel project

26 June 2012 - 03:25 PM

So a while ago I saw a video for a 4D puzzle game (Miegakure). I thought it was really neat, but it got me thinking... What would an actual 4D renderer look like? What's the best way to represent the fourth dimension? I thought about using 4D tetrahedral models, rendered with a shader to select the current 3D "slice", but that seemed too unwieldy. The most straight forward way, in my mind, was to take the "ray-casting 3D voxels" concept and just add a fourth dimension.

My program uses a 4D sparse voxel octree (I call it a hypertree) which acts exactly the way you'd expect: each dimension splits into two, which means that a node has up to 16 four dimension children volumes. I copied the ray casting algorithm from the Laine and Karras SVO paper (minus the contours), and added in an extra dimension to everything. To visualize the fourth dimension (W), I leave Z as up and down, but rotate the viewer's other three dimensions so that W replaces X or Y. Mathematically it works quite nicely, and doesn't look too bad.

One of the biggest issues that I had with it is that a 4D hypertree can get very big very quickly. Since every node can have 16 children, if I were to store all the leaf nodes I'd only be able to work with relatively shallow trees (e.g. at 4 bytes per node, seven levels is 1 GB). Since it's a sparse tree I don't store all this, but the potential is there. I also came up with two other solutions to this size problem. The first is to have portal nodes, which store a transformation matrix to teleport viewing rays, or object positions, from that node to some other node (and orientation). So even if the entire world is only 128 leaf nodes on a side, you can make larger environments by hijacking other (unused) dimensions seamlessly. The portal transformation does incur a performance hit though for every ray-portal intersection.

My second solution to the size problem is to not store unique geometry at the bottom of the tree. Using a palette of premade leaf node "tiles", you can give the environment more detail without having to store it all uniquely. Or at least that's how it would work... I haven't actually implemented this yet. I got the idea from watching that Unlimited Detail video, which looks like it uses a similar idea with 3D tiles nodes.

My other issue with a 4D renderer is that generating interesting content is difficult to do without an editor. I stopped working on it about the time I realized that I'd need to make an editor to get the full potential out of it as a concept. I'll probably pick it up again one of these days though.

So that's my experience with "voxels". If anyone wants me to go into more detail about anything I can, but I don't want to post the program right now.

In Topic: Spherical Harmonics comparison

23 March 2012 - 07:25 PM

You could take the difference between the coefficients of the two, then integrate over the sphere with these new coefficients, but using the absolute value of the function, to get the L1 distance. To integrate I'd say probably just do a basic Monte Carlo integration by having a set of a few dozen or so points on the unit sphere that you can plug into the resulting difference SH function. This should work because the L1 distance between two functions is something like

where and

Here, c and d are your coefficients, and the y's are the SH basis functions. So a Monte Carlo integration would be something like

for a set of N points (uniformly distributed) on the unit sphere. Here w(x) is a weight function, which would be equal to 4pi if you use a uniform distribution on the sphere.

You could also replace taking the absolute value with an L2 norm to get the L2 distance. I think I got all that right... hope that helps.


In Topic: Order-Independent Transparency

23 March 2012 - 04:10 AM

You might find these interesting:

Stochastic Transparency: http://www.nvidia.com/object/nvidia_research_pub_016.html
Colored Stochastic Shadow Maps: http://research.nvidia.com/publication/hardware-accelerated-colored-stochastic-shadow-maps

The first is about doing screen-door transparency at a sub-pixel scale, using multisampling hardware, but randomizing the pattern. The second extends that for use in shadow maps. You might also find some other techniques in the related works sections of them.

It sounds like your algorithm will be very useful, and I'm looking forward to reading about it.


In Topic: Problem with clearing a 3D texture in FBO

23 March 2011 - 05:55 PM

So I started to look at other means of checking whether or not the I'm setting things up correctly. While the framebuffer status says it's ok, and nothing seems to be causing any GL errors, I started checking all the framebuffer attachment parameters (glGetFramebufferAttachmentParameteriv()). All parameters seem to check out except the one I want, GL_FRAMEBUFFER_ATTACHMENT_LAYERED. It throws a GL_INVALID_ENUM error even though it should work. With a quick internet search I found this and the follow up LWJGL bug report. The poster's setup is virtually identical to mine (Win7 64-bit, Radeon 4850), so I strongly suspect that it's a driver problem; it's just not dealing with layered textures correctly.

In the mean time I suppose I'll use karwosts' idea and just manually fill the texture with a solid color in a simple shader.