Opengl 我如何解决alpha的失败?
我如何解决密度与Z阶求和的问题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:/
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看到它已经在蓝点前面画了一个红点,所以它跳过了它
这适用于不透明对象,但不适用于透明对象,这就是为什么您遇到这么多麻烦的原因你必须把东西拉回到前面。 通常你可以用