Question for Andrew

40 posts in this topic

Hi Andrew, i sent you an e-mail a while back about the possibility of changing the rendering method in the Voxel room to improve fine details. Obviously you know a lot more about this stuff than i do, but i wondered if you can clear up some questions for me and perhaps we might be able to discuss some future options to improve things. Everyone else is welcome to add their own ideas/opinions of course!

Firstly i want to illustrate the current situation, and i tried to set up a test to directly compare the fine surface detailing abilities between 3D-Coat and ZBrush (since i have the trials of both software installed).

Here is the 'control' object. A very basic sphere mesh:

Next i scaled the object until one segment filled the viewport (i never moved the camera after this):

Next i subdivided the mesh to ~25,000,000 polygons and made a few marks at very small brush sizes:

Next i opened up 3D-Coat and loaded the same mesh (merge>select mesh) and once again scaled it so one face filled most of the view (again i never moved the camera after this):

Then i subdivided the mesh 4-5 times until the faces were no longer visible to give a closer approximation to the subdivided ZBrush sphere. (poly count reduced slightly due to the volume change):

After the volume had completed the merge operation i tried to make a few marks with increasingly smaller brush sizes:

Now we can see immediately that the difference in surface detail between the two approaches is huge. I know that this is not a direct comparison because of the way polygons are being used is fundamentally different in the two applications, but i think it's still something worth discussing since total usable geometry seems to be what is holding 3DCoat back.

Here are my Questions for you:

1: Would switching to a pure voxel render solution be more efficient (in terms of performance) and allow us to scale object density up further than the current polygon skin render? I know this would result in discrete 'steps' between each voxel, but if we could get the density high enough i think it could work very well.

2: If voxel rendering is not a valid option could the existing 'polygon skin' method be optimized to allow us to work on 60-80m+ poly objects to achieve the same detail level as ZBrush does at ~25m?

Please don't take this thread as an attack on 3D-Coat, i think the program is incredible! I prefer 3D-Coat to ZBrush in every respect except for this issue of very fine details. I'd just be really interested to hear your thoughts on these questions - and possible ideas you might have for improving the fine detailing in 3D-Coat in the future.

Thanks very much for your time!

Share this post

Link to post

Share on other sites

1: Would switching to a pure voxel render solution be more efficient (in terms of performance) and allow us to scale object density up further than the current polygon skin render? I know this would result in discrete 'steps' between each voxel, but if we could get the density high enough i think it could work very well.

2: If voxel rendering is not a valid option could the existing 'polygon skin' method be optimized to allow us to work on 60-80m+ poly objects to achieve the same detail level as ZBrush does at ~25m?

It's not the render that is the issue, it's the data structure. Voxels (level set) cannot be compared to polygons, ESPECIALLY when you have something like a sphere, which is a pretty ideal case for polygons, but a huge waste for voxels. With voxels, all the voxels distance from the surface still have to be stored in memory (unless there is a hierarchical data structure) and you aren't using them. Consider, you could create dozens or even hundreds of concentric spherical shells and not use any more memory with voxels, but if you used polygons would have dozens or hundreds of times more polygons to store/process.

Polygons do better on objects where the ratio of surface to volume is small. Spheres, cubes, etc. Voxels do better when the ratio of surface to volume is high. Sponges, trees, etc. Polygons also do better when there is a high variance of frequencies. Voxels do better when there is even frequencies.

Try making a sponge with voxels and polygons and see how the change in data structure makes the voxels so much faster and lighter in memory consumption.

- Chad

Share this post

Link to post

Share on other sites

Well I've mentioned this a few times already, but the difference in detail is caused by the hardware phong shading in 3D Coat. ZBrush doesn't use any form of shading on its models. This is why ZBrush models look faceted when low poly and yet smooth when high poly.

If you take your 3D Coat model into another program that allows you to disable shading then you'll see that it looks as good as the ZBrush version.

It would be very easy for Andrew to allow us to disable shading, but because a non shaded model might look great in 3D Coat or ZBrush it doesn't mean it's going to look great when in a game engine or an external renderer when shading is enabled again, or when you drop a normal map onto your model.

So for me I personally prefer the WYSIWYG approach. The only people that would really benefit from disabling shading are the folks that plan to export a multi million poly model from 3D Coat and display it in a renderer with shading disabled. It also might be good for people that just want to render their model in 3D Coat and publish an image of it.

Share this post

Link to post

Share on other sites

It's not the render that is the issue, it's the data structure. Voxels (level set) cannot be compared to polygons, ESPECIALLY when you have something like a sphere, which is a pretty ideal case for polygons, but a huge waste for voxels. With voxels, all the voxels distance from the surface still have to be stored in memory (unless there is a hierarchical data structure) and you aren't using them. Consider, you could create dozens or even hundreds of concentric spherical shells and not use any more memory with voxels, but if you used polygons would have dozens or hundreds of times more polygons to store/process.

Polygons do better on objects where the ratio of surface to volume is small. Spheres, cubes, etc. Voxels do better when the ratio of surface to volume is high. Sponges, trees, etc. Polygons also do better when there is a high variance of frequencies. Voxels do better when there is even frequencies.

Try making a sponge with voxels and polygons and see how the change in data structure makes the voxels so much faster and lighter in memory consumption.

- Chad

Sorry maybe i should have been clearer in my post, i'm aware of the differences between voxels and polygons (but dont forget 3D-Coat uses a polygonal skin to display the volume, so poly count directly affects performance). The only reason i used a sphere for the example is because i could quickly and easily allign one quad to the screen size, so that i knew i was looking at the same small surface area (realtively) between the 2 apps. I don't see how the overall shape of the object has any bearing in a test like this that's purely for looking at fine surface detail though. Because 3D-Coat essentially becomes unusable beyond ~20 million poly's for most people, that's as far as i took it (ZBrush still runs very smooth at this res). I wasn't intending to say that polygons are the same in both apps, this is just as close to an accurate comparison of surface detailing that i can make.

My question is whether we will ever be able to get the same level of detail on surfaces in 3D-Coat that are possiple is ZBrush. Whether that be by optimizing the current polygonal skin method to allow for much higher resolution, or using true voxel rendering at a super high density or whatever. If it's not possible that's fine, but i'd still like to hear what Andrew might be able do to increase efficiency down the line.

I fully understand the benefits of using voxels, but i just want to know if we will be able to get the same resolution for fine detail work eventually that other apps have.

Does that make sense?

Share this post

Link to post

Share on other sites

If you take your 3D Coat model into another program that allows you to disable shading then you'll see that it looks as good as the ZBrush version.

Hmm, i can't see how that's possible. In my test 3D-Coat simply failed to even create the detail at smaller brush sizes, the resolution is just not there. Surely to get the same detail as the ZBrush model, you would have to double the poly count or more to compensate for the (relatively) inefficient use of tri's on the Voxel 'skin'. I'm sure shading would make a difference, but you'd still need the geometry there to pick up the details in the first place.

Share this post

Link to post

Share on other sites

Hmm, i can't see how that's possible. In my test 3D-Coat simply failed to even create the detail at smaller brush sizes, the resolution is just not there. Surely to get the same detail as the ZBrush model, you would have to double the poly count or more to compensate for the (relatively) inefficient use of tri's on the Voxel 'skin'. I'm sure shading would make a difference, but you'd still need the geometry there to pick up the details in the first place.

Your test didn't just demonstrate the difference between shading models but it also demonstrated the difference between two totally different brushes.

Another way to demonstrate the shading issue would be to export the above ZBrush model into another program with phong shading and you'll see the super fine detail vanish.

Still, I'm not denying that both surfaces in either programs are different. All I'm saying is that the biggest difference is caused by the shading in 3D Coat and not the poly count.

Share this post

Link to post

Share on other sites

Your test didn't just demonstrate the difference between shading models but it also demonstrated the difference between two totally different brushes.

Another way to demonstrate the shading issue would be to export the above ZBrush model into another program with phong shading and you'll see the super fine detail vanish.

Still, I'm not denying that both surfaces in either programs are different. All I'm saying is that the biggest difference is caused by the shading in 3D Coat and not the poly count.

I used the standard brush in ZBrush and the Clay brush in 3D-Coat with the solid circular alpha. I can't see how that would make any difference when clearly once you go to a small brush size in 3D-Coat you are at or below the size of an individual voxel. It seems to me that for every voxel in 3D-Coat, ZBrush has about 4 polygons (this is to be expected since a huge number of polygons in 3D-Coat are used up around the edges of each voxel for smoothing - so the voxel 'grid' is much less dense compared to the polygon 'grid' in ZBrush), so i think you would need another subdivision in 3D-Coat to get the same detail. That would mean approximately 100m poly's.

This is why i'm wondering if a pure voxel rendering approach could be made efficient enough to allow for another subdivision level or two than is possible at the moment. That way we mght be able to have the best of both worlds, total freedom from topology concerns and super high detail surfaces as well.

Share this post

Link to post

Share on other sites

This is why i'm wondering if a pure voxel rendering approach could be made efficient enough to allow for another subdivision level or two than is possible at the moment. That way we mght be able to have the best of both worlds, total freedom from topology concerns and super high detail surfaces as well.

Further subdivision levels will be possible when Andrew adds the planned subdivision/multi-res support in Surface mode. I suspect voxels are a little too memory hungry and wasteful for super high detail.

Share this post

Link to post

Share on other sites

And one more thing - 3D Coat's poly count is in triangles while ZBrush's poly count is quads. So perhaps it might be best to double ZBrush's poly count before comparing it with 3D Coat.

So 20 million quads in ZBrush is the equivalent to 40 million triangles in 3D Coat.

Further subdivision levels will be possible when Andrew adds the planned subdivision/multi-res support in Surface mode. I suspect voxels are a little too memory hungry and wasteful for super high detail.

Aye that's a good point about ZBrush using quads. So differences in technology aside ZBrush probably has an effective geometry advantage of something like 4:1 over 3DC in super fine details at the moment (that's best case scenario, obviously it depends on topology). That's just going by what is possible on my machine, 20 million triangles and above is unusable for me in 3DC, and about 30-40 million quads is as high as i can go in ZBrush.

Like i said in my first post this is not in any way meant as an attack on 3DCoat, i think the app is simply amazing to use and the very high surface details are literally my only 'problem' with it. I'm just interested in how much room for improvement there is in this one area down the line and thought it might be interesting to have a thread where we could get Andrews opinion as he has the perspective of someone with huge knowledge about this stuff.

If voxels and super high geometry just don't go together on the hardware we have available today then that's fine - i'm just curious about what is possible

I'm certainly looking forward to Multi-Res in surface mode if this will go some way to helping!

Share this post

Link to post

Share on other sites

+1 to Splodge on the point of adding a FLAT shade mode to the vox room. Has anyone posted a feature request for that one yet...wont looks quite the same for tris... but still, would be a nice addition that Andrew could likely code in a few minutes.

************************************************************

Thank you very much for the comparison images and text for the comparison. You've put into words what many 3DC users also recognize.

Another example of why IMO 3DC might want to consider an ADAPTIVE TESSELLATION method for creating/drawing the POLY skin for the voxels....

For this dynamic tessellation, I would suggest USING ONE OF THE OTHER 7 CORES THAT 3DC REFUSES TO USE IN OSX AND WINDOWS!!!!, MULTITHREAD 3DC PLEASE!; in addition, perhaps use CUDA, or preferably OpenCL so all us Ati users can benefit too.. as now there is an automatic OPEN SOURCE converter for CUDA to OpenCL. All the sudden 20 million turns into 10-15 mil, or less.

Share this post

Link to post

Share on other sites

should the new multi-res mode be turned into actually adding multi-res to the sculpt room so that you just leave the vox room and go into a robust sculpt room for multi-res work... thus we get the multires, but IMO it logically moves the multires mesh from the vox room to the sculpt room... AS LONG AS IT DOES NOT PREVENT THE FURTHER EDITING OF THE VOXELS.... just an idea...

**************

But for multi-res, using the current poly skinning method, wouldn't it need to be quads(or turned into quads) for proper subdividing(equation wise) anyway?

Wonder what Andrew is going to do there... Maybe quadrangulate then subdivide, but then I'm getting lots of snapping errors in the retopo room with quadrangulates meshes...

so hmmm.... Fix the snapping algorithm too(PLEASE!)

Share this post

Link to post

Share on other sites

For this dynamic tessellation, I would suggest USING ONE OF THE OTHER 7 CORES THAT 3DC REFUSES TO USE IN OSX AND WINDOWS!!!!, MULTITHREAD 3DC PLEASE!; in addition, perhaps use CUDA, or preferably OpenCL so all us Ati users can benefit too.. as now there

Tessellation isn't the same as decimation. You couldn't apply that method to a voxel mesh. Doing so would result in 10x more polygons. It would be the total opposite of what you want.

Tessellation takes a low poly object and smooths it out by subdividing the geometry in real time. As you've shown, somebody has developed a smarter version that is a little more optimal, but it's still adding geometry to a low poly object. It doesn't reduce the geometry.

Share this post

Link to post

Share on other sites

use a less accurate world space measurement of a voxel region to generate a lower-res poly mesh(say 1X for example), then apply adaptive tessellation to the poly skin according to a calculation with more spatial accuracy to generate a more detailed poly-skin(say 2x or 4x) using that more accurate calculation for a given voxel region the user is sculpting on, gather areas with lower regional incidences of normal-angle differences(surfaces that are more flat than volatile) and use adaptive tessellation to calculate a MUCH MORE OPTIMIZED version of the poly-skin allowing for much higher detail while applying the detail intelligently, with low cpu usage, while making for a much faster workflow/redraw/memory use on GPU.

Or you could decimate if you wanted to waste cpu/gpgpu cycles... would still get mostly the same product, but have to work with an initially higher res poly skin, which IMO is unnecessary given the ability to use spatial calc references of the actual voxels(8x8 i think per voxel)

hope that quick description comes through semi-coherently, I'm busy sculpting in 3DC at the moment... :-)

Share this post

Link to post

Share on other sites

which mesh has more polys in your opinion? Left or Right? Guess which one is adaptive?

The original low poly mesh isn't being shown. The image is showing the difference between standard tessellation and adaptive tessellation. The image is assuming that the viewer understands that a low poly object was the source object.

Share this post

Link to post

Share on other sites

The original low poly mesh isn't being shown. The image is showing the difference between standard tessellation and adaptive tessellation. The image is assuming that the viewer understands that a low poly object was the source object.

a voxel calculation of lower accuracy could easily generate a low-poly skin to a highly detail voxel object. You could also average out the voxel calculation to a specified degree to generate a spatially "blurred/smoothed" object for low poly vox skin generation.

Share this post

Link to post

Share on other sites

Sorry maybe i should have been clearer in my post, i'm aware of the differences between voxels and polygons (but dont forget 3D-Coat uses a polygonal skin to display the volume, so poly count directly affects performance).

No, voxel count + polygon count affects performance. In Zbrush, you are only worried about polygon count. If you want to compare apples to apples, don't add the voxel overhead, compare teh two when using only polygons. The mesh shown is only a proxy of the underlying levelset surface. The SDK allows you to export this array to your rendering software so you can render the levelset directly. Zero polygons.

- Chad

Share this post

Link to post

Share on other sites

No, voxel count + polygon count affects performance. In Zbrush, you are only worried about polygon count. If you want to compare apples to apples, don't add the voxel overhead, compare teh two when using only polygons. The mesh shown is only a proxy of the underlying levelset surface. The SDK allows you to export this array to your rendering software so you can render the levelset directly. Zero polygons.

- Chad

So using voxels will always be vastly less efficient vs regular polygonal methods in terms of overall geometry achievable on current hardware?

Like my suggestion of an option to remove the polygonal skin from the voxel room and work directly on the levelset (as i understand it there are several alternative methods of smoothing a voxel volume that don't use a polygonal skin), would this be more resource friendly and allow us to work at an additional subdivision level than is currently possible?

This is exactly the stuff i am trying to find out, i realise voxels have many advantages but if we won't be able to get much finer control over surface details at some point i think it's important to know this in advance so people don't get their hopes up too much. If voxels will be limited to mid-high frequency details, with the final touches being done in Paint room or another application then i can live with that, i just want to know one way or the other what's going to be possible in near future with the voxel room.

For me the idea of working on a model from start to finish (including painting when Andrew implements this) entirely in voxels is very exciting, but the overall geometry needed for fine detailing is just not possible at the moment.

Share this post

Link to post

Share on other sites

So using voxels will always be vastly less efficient vs regular polygonal methods in terms of overall geometry achievable on current hardware?

No, it depends on the ratio of surface area to volume, and the range of frequencies.

Like my suggestion of an option to remove the polygonal skin from the voxel room and work directly on the levelset (as i understand it there are several alternative methods of smoothing a voxel volume that don't use a polygonal skin), would this be more resource friendly and allow us to work at an additional subdivision level than is currently possible?

You would still need SOME way to rendering the levelset. A raymarcher would work, but it may be slower than polygon skinning. It would be more memory efficient, but slower. Especially if the levelset is not being updated, but the view is changing. So if you are rotating or zooming or whatever, the polygon skin is very fast, since the conversion to polygons from voxels is cached, and the polygon rendering is done in hardware.

This is exactly the stuff i am trying to find out, i realise voxels have many advantages but if we won't be able to get much finer control over surface details at some point i think it's important to know this in advance so people don't get their hopes up too much. If voxels will be limited to mid-high frequency details, with the final touches being done in Paint room or another application then i can live with that, i just want to know one way or the other what's going to be possible in near future with the voxel room.

For me the idea of working on a model from start to finish (including painting when Andrew implements this) entirely in voxels is very exciting, but the overall geometry needed for fine detailing is just not possible at the moment.

There's two options, really. Either break up the voxel array into a hierarchy of some sort or do only low frequency work in voxels and do high frequency work in polygons or displacements. What's the problem with shifting over to polygon surface modeling for the high-frequency detailing?

- Chad

Share this post

Link to post

Share on other sites

No, it depends on the ratio of surface area to volume, and the range of frequencies.

You would still need SOME way to rendering the levelset. A raymarcher would work, but it may be slower than polygon skinning. It would be more memory efficient, but slower. Especially if the levelset is not being updated, but the view is changing. So if you are rotating or zooming or whatever, the polygon skin is very fast, since the conversion to polygons from voxels is cached, and the polygon rendering is done in hardware.

There's two options, really. Either break up the voxel array into a hierarchy of some sort or do only low frequency work in voxels and do high frequency work in polygons or displacements. What's the problem with shifting over to polygon surface modeling for the high-frequency detailing?

- Chad

I think i understand what you are talking about re: surface to volume, where certain forms will definately benefit voxels, but lets say for example modeling a humanoid figure (probably the most common modeling task in sculpting apps). It seems to me that using a polygonal modeling approach like ZBrush or Mudbox allows for much higher detail levels than we can get with the 'marching cubes' representation of voxels.

Yes i understand that the actual voxel data set still needs to be rendered, i was assuming some kind of cube or spherical primitives for each individual voxel. If you go to the Wikipedia page on Voxels, there is an image on the left hand side of the page which shows what i'm talking about:

Does that type of representation require raycasting? I know that voxels and raycasting apparently work well together (at least much faster than using polygons) but maybe there are other methods that could be used?

There's no problem with using a polygonal modeling app for the fine surface detailing (other than having to invest in more expensive software). That's what i was saying before, if that's the way the workflow has to be for the time being i totally understand, i'm just curious if 3DCoat could really become a one-stop-shop for modeling with some improvements to the voxel room

Perhaps i have come across the wrong way in this thread, but i'd just like to repeat that i'm not attacking 3DCoat in any way - it's awesome software! I'm not accusing Andrews way of working with voxels of being inefficient, he clearly knows a hell of a lot more than i do about any of this! - i'm just wondering if there can be alterations made down the line that will allow for that extra level of final detailing within 3DCoat.

One more thing, there is the possibility of game engines using super high detail voxel volumes for world assets etc.. within the next few years or so (proabably when the next console generation arrives). I know that you could do the lions share of the work in polygons then convert that mesh to a voxel volume (exactly as we can do now in 3DCoat) but there will still be the need to finish of the fine details in voxels before you export to whatever format the engines will be using (SVO seems to be the best bet from what i have read). If that kind of technology takes off then we'll have to get around this fine detail issue one way or another.

I think polygonal modeling tools seem to be at the point of diminishing returns to some extent (ie: when you get to a certain level of detail, the work involved in going much higher does not pay off in terms of what the viewer would actually notice). Maybe it will just be a case of waiting for computer hardware to become powerful enough to allow us to work with larger voxel data sets, so we can match what is being done in ZBrush/Mudbox at the moment, i'd just like to know if there is any room for improvement before that time.

When I bought 3D-Coat, I was really hoping that it's use of voxels would give me a "poor man's" version of ClayTools or FreeForm without the Haptic device.

So now I'm kind of left slightly confused as to why one program with voxels can do this & the other with voxels can't??

Curious to know what the answer might be?

regards Colin

Hey don't worry at all, you have made a very good purchase decision with 3DCoat, i've taken a look through the gallery images on the sensable site and 3DCoat can EASILY match that level of detail. I think we just have a different definition of high details.

Just to be clear what i'm talking about in this thread is ULTRA-FINE detailing, the likes of which you can find if you go to the ZBrush website and look through their 'featured' gallery. I'm talking skin pore level of detail here. 3DCoat has really good mid-high detail, there is no issue there at all.