如何根据Z顺序解决密度失败的问题?
void setup() {
size(600, 480, P3D);
}
void draw()
{
background(0);
translate(width/2, height/2);
stroke(color(255,255,255),128); // 50% alpha
strokeWeight(130.0);
point(0,0,0);
point(-100,0,1); // density sums http://i.imgur.com/NfFv9SJ.png - expected
point(100,0,-1); // density does not sum http://i.imgur.com/Eyq2qdZ.png - unexpected
}
在V3上测试。
答案 0 :(得分:0)
这与your other question相同。
我在你的另一个问题中更详细地解释了它,但请记住,Processing正在使用深度缓冲来确定何时不来绘制已经绘制的像素后面的像素。
假设您正在绘制两个点:0,0,0
处的一个点和0,0,100
处的第一个位于<{1}}的第一个点。这是OpenGL的作用:
0,0,0
0,0,100
这就是左点有效的原因。它位于中间点之前,之后你就会画它。
但是如果你有相反的情况,那么还有两点:一个在0,0,0
而另一个在后面第一个在0,0,-100
。这是OpenGL的作用:
0,0,0
0,0,-100
您的代码中混合了第一种情况和第二种情况。你绘制中心点,这绘制得很好。然后,您可以在前面的中心点绘制左边的点,这样就可以了。但是,你试图在中心点后面后面,这是行不通的。 你必须从后到前画画。
如果您使用不同的颜色,这将变得更加明显:
//red middle
stroke(255, 0, 0 ,128);
point(0,0,0);
//green left front
stroke(0, 255, 0 ,128);
point(-100,0,1);
//blue right back
stroke(0, 0, 255 ,128);
point(100,0,-1);
在这里,我们看到你在中间绘制红点,然后在它前面绘制绿点,这是有效的。然后你尝试绘制它背后的蓝点,这是行不通的。 OpenGL看到它已经在蓝点前面画了一个红点,所以它会跳过它。
这适用于不透明对象,但它不适用于透明对象,这就是为什么你遇到这么多麻烦。 你必须把事情拉回到前面。
通常你可以使用hint(ENABLE_DEPTH_SORT)
,但在这种情况下这不起作用。这些可能看起来像圆圈,但它们不是。他们是像素,你正在做大。这也是为什么Processing.js将它们绘制为正方形而不是圆形的原因 - 这不是一个真正的错误,因为你可以将“像素爆炸130次”视为正方形或圆形。无论如何,看起来Processing不会为你排序像素的子像素。
您有三种选择:
选项1:停止使用透明度。这是导致所有问题的原因。
选项2:自行进行排序。如果您从后向前绘制像素,则问题就会消失:
//blue right back
stroke(0, 0, 255 ,128);
point(100,0,-1);
//red middle
stroke(255, 0, 0 ,128);
point(0,0,0);
//green left front
stroke(0, 255, 0 ,128);
point(-100,0,1);
选项3:自己进行炫耀。你依靠strokeWeight()
来获得巨大的分数。这不起作用,因为Processing的内置排序算法无法为您处理此问题。相反,使用更常规尺寸的像素自己绘制大的形状。 the reference中有许多用于构建3D形状的函数。