我如何解决sphere()输出的损坏?

时间:2016-06-18 13:42:18

标签: processing

我如何解决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
}

1 个答案:

答案 0 :(得分:3)

经过一堆谷歌搜索,这是我发现的:

这不是一个真正的错误或腐败,因为它确实是OpenGL(以及因此处理)的行为方式。 Here是一篇文章,它比我能更好地解释它。

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

您可以通过在setup()函数中启用深度排序提示来告诉Processing根据深度进行排序:

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问题。但这并没有很好的记录,所以如果有人有更多的信息,我很乐意扩大这个答案。