加工中的透明纹理形状

时间:2014-05-26 05:27:06

标签: object transparency processing alpha

我正在使用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图像平面来解决这个问题,看看它是否是第二个以及所有后续几何图形是否具有适当的透明度(而第一个总是淡化为背景颜色,否则保持不透明)。

1 个答案:

答案 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);
}