My suspicion (which may be completely wrong) is that the Mac version of Blender is not programmed to use a higher depth z-buffer so it will show the problem on both high-end and low-end machines but that possibly the Windows version has the OpenGL calls that enable a higher z-depth buffer when it’s available. The source code shows this:
Win32:
static PIXELFORMATDESCRIPTOR sPreferredFormat = {
sizeof(PIXELFORMATDESCRIPTOR), /* size /
1, / version /
PFD_SUPPORT_OPENGL |
PFD_DRAW_TO_WINDOW |
PFD_SWAP_COPY | / support swap copy /
PFD_DOUBLEBUFFER, / support double-buffering /
PFD_TYPE_RGBA, / color type /
32, / prefered color depth /
0, 0, 0, 0, 0, 0, / color bits (ignored) /
0, / no alpha buffer /
0, / alpha bits (ignored) /
0, / no accumulation buffer /
0, 0, 0, 0, / accum bits (ignored) /
32, / depth buffer /
0, / no stencil buffer /
0, / no auxiliary buffers /
PFD_MAIN_PLANE, / main layer /
0, / reserved /
0, 0, 0 / no layer, visible, damage masks */
};
Linux X11:
int GL_capabilities =
{
GLX_DOUBLEBUFFER, // front and back buffers
GLX_RGBA, // rgba display
GLX_DEPTH_SIZE, 8, // at least 8 bits deep
GLX_RED_SIZE, 1, // of which at least 1 red
GLX_GREEN_SIZE, 1, // of which at least 1 green
GLX_BLUE_SIZE, 1, // of which at least 1 blue
None
};
OS X:
static const GLint sPreferredFormatWindow = {
AGL_RGBA, GL_TRUE,
AGL_DOUBLEBUFFER, GL_TRUE,
AGL_DEPTH_SIZE, 16,
AGL_AUX_BUFFERS, 1,
AGL_NONE,
};
I can’t remember if it was 8 in the OS X one because I tried to change them once to see if it would make a difference and it didn’t seem to but then again maybe my GPU only supports an 8-bit z-buffer so I wouldn’t notice the difference anyway.
Another thing I came across on the OpenGL site was this:
12.080 There is no way that a standard-sized depth buffer will have enough precision for my astronomically large scene. What are my options?
The typical approach is to use a multipass technique. The application might divide the geometry database into regions that don’t interfere with each other in Z. The geometry in each region is then rendered, starting at the furthest region, with a clear of the depth buffer before each region is rendered. This way the precision of the entire depth buffer is made available to each region.
Maybe that’s what needs to be done to ensure no artifacts happen. I had to use this method for doing more accurate edge detection for a Renderman toon shader. This still has issues if a single object has large and small parts though, I think it would only work for individually large and small objects.
I didn’t see any artifacts when I tried Cekhunen’s scene in Maya (BTW, the OBJ exporter should really just export the visible layers - I had to delete them all). However, something’s gone screwy with Maya again (possibly a system update) whereby it hangs up when I click any of the menus that let me access the camera clipping values :rolleyes:. That’s one thing I can say about Blender. It may have its faults but it’s damn reliable.