Opengl 我如何解决alpha的失败?

Opengl 我如何解决alpha的失败?,opengl,processing,Opengl,Processing,我如何解决密度与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:/

我如何解决密度与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,0
处,另一个在
0,0100
处第一个点的前面。以下是OpenGL的功能:

  • 获取在
    0,0,0
  • 看到还没有画出任何东西,所以画出那个点
  • 获取在
    0,0100处绘制第二个点的请求
  • 看到第一个点在新点的后面,因此绘制新点
这就是为什么左点有效。它在中间点的前面,然后再画

但是如果你有相反的情况,同样有两点:一点在
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看到它已经在蓝点前面画了一个红点,所以它跳过了它

这适用于不透明对象,但不适用于透明对象,这就是为什么您遇到这么多麻烦的原因你必须把东西拉回到前面。

通常您可以使用
提示(启用深度排序)
,但在这种情况下不起作用。这些可能看起来像圆圈,但它们不是。它们是
像素,您正在制作巨大的图像。这也是Processing.js将它们绘制为正方形而不是圆形的原因——这不是一个真正的错误,因为您可以将“像素放大130倍”的情况解释为正方形或圆形。无论如何,处理似乎不会为您排序像素的子像素

您有三种选择:

选项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:自己动手。您正依靠
strokewweight()
来绘制大量点。这不起作用,因为处理的内置排序算法无法为您处理此问题。取而代之的是,自己用更规则大小的像素绘制大的形状。中有一系列用于构建三维形状的函数。

这与相同的问题

我在您的另一个问题中对此进行了更详细的解释,但请记住,处理是使用深度缓冲来确定何时绘制位于已绘制像素后面的像素

假设您正在绘制两个点:一个在
0,0,0
处,另一个在
0,0100
处第一个点的前面。以下是OpenGL的功能:

  • 获取在
    0,0,0
  • 看到还没有画出任何东西,所以画出那个点
  • 获取在
    0,0100处绘制第二个点的请求
  • 看到第一个点在新点的后面,因此绘制新点
这就是为什么左点有效。它在中间点的前面,然后再画

但是如果你有相反的情况,同样有两点:一点在
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看到它已经在蓝点前面画了一个红点,所以它跳过了它

这适用于不透明对象,但不适用于透明对象,这就是为什么您遇到这么多麻烦的原因你必须把东西拉回到前面。

通常你可以用