我怎样才能解决这种alpha失败的问题?

时间:2016-06-17 20:55:16

标签: opengl processing

enter image description here enter image description here

如何根据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上测试。

1 个答案:

答案 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形状的函数。