processing4 icon indicating copy to clipboard operation
processing4 copied to clipboard

Blendmode not respecting alpha in P3D under certain circumstances

Open RectangleWorld opened this issue 1 year ago • 0 comments

Description

The additive blendmode does not respect alpha under certain circumstances.

When the following code is run, the two circles drawn have 100% alpha, but we should expect them to have 50% alpha (set by 0x80). There are workarounds, explained below.

void setup() {
  size(800, 800, P3D);
  generate();
}

/*
If the draw() function is removed, blending honors alpha, 
whether or not the last line of generate() is included.
*/
void draw() {
  //
}

void generate() {
  blendMode(BLEND);
  background(0xFF000000);
  noStroke();
  blendMode(ADD);
  fill(0x80FF0000);
  circle(300,300,400);
  fill(0x8000FF00);
  circle(500,500,400);
  // If this last line is omitted, blending doesn't honor alpha.
  //blendMode(BLEND);
}

Workarounds

Blending will honor alpha as expected if one of these things is done:

  • Omitting the draw() function
  • Making sure to set the blend mode back to BLEND at the end of the generate() function
  • Drawing into a PGraphics buffer and then drawing this buffer to the screen as in this code:
void generate() {
  PGraphics pg = createGraphics(width, height, P3D);
  pg.beginDraw();
  pg.blendMode(BLEND);
  pg.background(0xFF000000);
  pg.noStroke();
  pg.blendMode(ADD);
  pg.fill(0x80FF0000);
  pg.circle(300,300,400);
  pg.fill(0x8000FF00);
  pg.circle(500,500,400);
  pg.endDraw();
  image(pg, 0, 0);
}

Environment

  • Processing version: 4.3
  • Operating System and OS version: Windows 11, version 22H2
  • Graphics: NVIDIA GeForce RTX 3050 Ti Laptop GPU

RectangleWorld avatar Jul 02 '24 01:07 RectangleWorld