обработка 3 закадровый урод

Я использую Processing 3 (и 2) как на OSX, так и на Windows. Линейная графика в закадровом буфере PGraphics значительно уродливее, чем непосредственно нарисованные линии. Кажется, что сглаживание по краям фигуры работает не очень хорошо.

Можете ли вы помочь мне сделать графику внеэкранного буфера более красивой?

Пример изображения (уродливое за кадром справа, на экране слева):

Образец кода

PGraphics pg;

void setup(){
  size (1024,768, P2D);
  pixelDensity(2);
  smooth();
  pg = createGraphics(width, height, P2D);
  noLoop();
}

void draw(){
  background (0);
  pushMatrix();
  translate (width/2-100, height/2);
  rotate (PI/6);
  stroke(255);
  noFill();
  strokeWeight(0.5);
  rect (0,0,100,100);
  popMatrix();

  pg.beginDraw();
  pg.smooth();
  pg.clear();
  pg.translate (width/2+100, height/2);
  pg.rotate (PI/6);
  pg.stroke(255);
  pg.noFill();
  pg.strokeWeight(0.5);
  pg.rect (0,0,100,100);
  pg.endDraw();

  image(pg,0,0, width, height);

  save("shot.png");
}

Спасибо!

Этот вопрос также был опубликован на форуме Processing здесь.


person janper    schedule 01.11.2015    source источник
comment
Укажите ссылку между кросспостами: forum.processing.org/two/discussion /13355/   -  person Kevin Workman    schedule 02.11.2015


Ответы (1)


Проблема вызвана тем, что Processing по умолчанию включает сглаживание. Вы включаете его явным образом, вызывая функцию smooth(), но обратите внимание, что это лишнее, поскольку оно уже включено по умолчанию.

Это приводит к тому, что ваши линии «размываются» между их собственным цветом и цветом фона. В экранном буфере этот цвет фона черный. В буфере вне экрана этот цвет фона прозрачен. Вот почему ваш закадровый квадрат выглядит более прозрачным — потому что это так.

Чтобы исправить это, вам нужно либо отключить сглаживание, вызвав noSmooth(), либо убедиться, что вы рисуете с одним и тем же цветом фона. Вот подход noSmooth():

PGraphics pg;

void setup(){
  size (1024,768, P2D);
  noSmooth();
  pg = createGraphics(width, height, P2D);
  noLoop();
}

void draw(){
  background (0);
  pushMatrix();
  translate (width/2-100, height/2);
  rotate (PI/6);
  stroke(255);
  noFill();
  strokeWeight(0.5);
  rect (0,0,100,100);
  popMatrix();

  pg.beginDraw();
  pg.noSmooth();
  pg.clear();
  pg.translate (width/2+100, height/2);
  pg.rotate (PI/6);
  pg.stroke(255);
  pg.noFill();
  pg.strokeWeight(0.5);
  pg.rect (0,0,100,100);
  pg.endDraw();

  image(pg,0,0, width, height);

}

введите здесь описание изображения

person Kevin Workman    schedule 03.11.2015