我如何解决sphere()输出的损坏?
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
}
答案 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问题。但这并没有很好的记录,所以如果有人有更多的信息,我很乐意扩大这个答案。