2016-06-18 71 views
1

我该如何解决sphere()输出的这种讹误?我该如何解决这个sphere()输出的腐败问题?

enter image description here

void setup() { 
    size(600, 600, P3D); 
} 

void draw() 
{ 
    background(0); 
    translate(width/2, height/2); 
    strokeWeight(0); 
    fill(color(255, 255, 255), 128); 
    sphereDetail(10);sphere(100); // corrupt: http://i.imgur.com/1XmA8Om.png 
} 

回答

3

一堆谷歌搜索后,这里就是我发现:

这是不是一个真正的错误或腐败,因为它究竟是如何的OpenGL(因此处理)被设计为表现。 Here是一篇比我能解释得更好的文章。

但基本上,Processing在OpenGL中绘制了一串三角形来为你呈现球体。由于您的球体是透明的,因此Processing正在将大量透明三角形绘制到屏幕上。这是有问题的,因为在这种情况下绘图顺序很重要。但默认情况下,Processing不会对它正在绘制的内容进行任何排序,因此最终会看到您所看到的工件。

你可以告诉处理通过使您setup()函数内部的深度排序暗示来挑选基础,以深度:

hint(ENABLE_DEPTH_SORT); 

有了这个此外,你有你漂亮的灰色领域:

你甚至可以在透明形状后面绘制透明形状:

void setup() { 
    size(600, 600, P3D); 
    hint(ENABLE_DEPTH_SORT); 
} 

void draw() 
{ 
    background(0); 
    translate(width/2, height/2); 

    strokeWeight(0); 
    sphereDetail(10); 

    fill(color(255, 255, 255), 128); 
    sphere(100); 

    translate(0, 0, -500); 
    fill(color(255, 0, 0), 128); 
    sphere(100); 
} 

试试这个不启用深度排序的提示,您将无法通过灰色球体看到红球!

但是,请注意,启用此功能会降低渲染速度。

Here是一个GitHub问题,讨论添加此功能。但是这不是很好的记录,所以如果有人有更多的信息,我会很乐意扩大这个答案。

+0

谢谢。这受到明显绘制球体隐藏背面的缺点的影响,因此像素颜色是192x3,而不是由alpha指定的128x3。但它可能比没有好。 – ChrisJJ

+0

@ChrisJJ也许我错过了一些东西,但看到球体的后部对我来说似乎是正确的。想想现实生活中的彩色中空玻璃球体:你看到球体的前部,然后通过它看到球体的后部,然后通过它看到球体后面的任何物体。你不会停止看到球体的后面。 –

+1

不错的答案(+1)! –