首页 文章

加工中的透明纹理形状

提问于
浏览
2

我正在使用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 回答

  • 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);
    }
    

相关问题