我正在使用Processing,我有这样的代码:
tint(255, alpha1--);
imp1.drawPlane();
tint(255, alpha2++);
imp2.drawPlane();
imp *是具有图像纹理的简单形状的对象:
void drawPlane() {
beginShape();
texture(texture);
vertex(x1, y1, z1, 0, 0);
vertex(x2, y2, z2, texture.width, 0);
vertex(x3, y3, z3, texture.width, texture.height);
vertex(x4, y4, z4, 0, texture.height);
endShape();
}
如果您想知道,纹理只是一个PImage。
我的问题:其中一个形状按预期反应,对其背后的一个是透明的,但另一个形状只与BACKGROUND(纯黑色场)混合而不是它后面的形状,并且会完全模糊背后的几何形状当它进入前面时(当我降低它的alpha时会逐渐变暗,因为它与黑色背景混合)。
互联网上有成千上万的处理透明度示例,说明如果背景设置为某些内容,如何使图像透明,但是尽可能地进行冲刷,我找不到任何一个几何体对其后面几何体透明的示例
我很高兴使用OPENGL或P3D画布类型。两者的行为都是一样的。
编辑:根据关于noTint()的答案添加以下内容。
现在代码执行此操作(并显示完全相同的损坏行为):
//before draw()
alpha1 = 255;
alpha2 = 1; //used to be 0, but 0 or 1 act the same
slideZ = -1;
//inside draw()
imp1.movePlane(slideLR, slideUD, slideZ);
tint(255, alpha1--);
imp1.drawPlane();
noTint();
imp2.movePlane(slideLR * -1, slideUD * -1, (slideZ * -1));
tint(255, alpha2++);
imp2.drawPlane();
noTint();
我还添加了“movePlane()”方法,因此您可以具体了解我在Z平面上移动的几何图形的含义。
我可能会尝试通过首先定义一个零无用的1x1图像平面来解决这个问题,看看它是否是第二个以及所有后续几何图形是否具有适当的透明度(而第一个总是淡化为背景颜色,否则保持不透明)。
答案 0 :(得分:2)
我认为tint()
将用于调用之下的所有内容,因此它们正在累积...请尝试使用noTint()
之后隔离每个调用。
一个例子:
PImage texture;
void setup() {
size(400, 400, OPENGL);
texture = loadImage("http://th06.deviantart.net/fs70/PRE/i/2011/326/f/2/texture_94_3000x3000_by_frostbo-d4h03rg.png");
texture.resize(400, 0);
frameRate(4);
background(texture);
}
void draw() {
pushMatrix();
tint(255, 180);
makeShape();
noTint();
popMatrix();
pushMatrix();
tint(255, 200, 0, 40);
makeShape();
noTint();
popMatrix();
}
void makeShape() {
float a, b, c, d;
a =random(0, PI/2);
b =random(PI/2, PI);
c =random(PI, PI*1.5);
d =random(PI*1.5, PI*2);
float magA = random(15, 50);
float magB = random(15, 50);
float magC = random(15, 50);
float magD = random(15, 50);
PVector[] vtx = new PVector[4];
vtx[0] = new PVector(cos(a)*magA, sin(a)*magA);
vtx[1] = new PVector(cos(b)*magB, sin(b)*magB);
vtx[2] = new PVector(cos(c)*magC, sin(c)*magC);
vtx[3] = new PVector(cos(d)*magD, sin(d)*magD);
translate(random(width), random(height));
beginShape();
texture(texture);
vertex(vtx[0].x, vtx[0].y);
vertex(vtx[1].x, vtx[1].y);
vertex(vtx[2].x, vtx[2].y);
vertex(vtx[3].x, vtx[3].y);
endShape(CLOSE);
}