注意:我也在处理论坛here上问了这个问题。
我有以下示例代码:
PGraphics pg;
void setup() {
size(400, 500);
pg = createGraphics(width, height);
pg.noSmooth();
pg.beginDraw();
pg.background(0, 0, 255);
pg.endDraw();
}
void draw() {
if (mousePressed) {
pg.beginDraw();
pg.stroke(255, 254);
pg.point(mouseX, mouseY);
pg.endDraw();
}
image(pg, 0, 0, width, height);
}
我希望该代码在用户按下鼠标的任何位置都能显示一个点。相反,我只能看到几个矩形区域中的点:
如果我删除对pg.noSmooth()
的调用,或者如果我删除了pg.stroke()
调用中的alpha值,则它可以正常工作:
如果我将pg.point()
调用替换为pg.ellipse()
或pg.rect()
,那么它也可以正常工作。
似乎结合使用PGraphics
,noSmooth()
函数,point()
函数和alpha值会导致这种错误行为。我在Processing 3.3和Processing 3.5.2中进行了尝试,并且在两者中看到了相同的行为。
我缺少明显的东西吗?
答案 0 :(得分:3)
经过一番挖掘后,JAVA2D
渲染器绘制了一个{<>>非常 非常的point as a diagonal line(line(x, y, x + EPSILON, y + EPSILON);
)。 strong> small spacing(static final float EPSILON = 0.0001f;
)。我的猜测是,这种特殊的配置没有混叠可能意味着这条对角线的两个点都落在同一像素上,并最终未在其右上角区域渲染。为什么不知道该区域以及为什么要走这么短的距离,但这听起来有点像Jakub Valtar令人头疼的事,而安德烈斯·库鲁布里(Andres Colubri)必须处理。
FWIW这是一个棘手的解决方法:使用更大的距离,可以实现透明且无锯齿的渲染:
PGraphics pg;
void setup() {
size(400, 500);
noSmooth();
pg = createGraphics(width/20, height/20);
pg.beginDraw();
// just for debug purposes: rectangle with edge
pg.fill(0, 0, 255);
pg.rect(0,0,pg.width-1,pg.height-1);
pg.stroke(255,255,255, 128);
pg.endDraw();
}
void pointNoSmooth(PGraphics pg, float x,float y){
pg.beginShape();
pg.vertex(x,y);
pg.vertex(x + 0.75,y);//any less than 0.75 distance between vertices and there's nothing to render with aliasing
pg.endShape();
}
void draw() {
background(255);
if (mousePressed) {
pg.beginDraw();
pointNoSmooth(pg,mouseX,mouseY);
pg.endDraw();
}
// render upscaled
image(pg, 0, 0, width, height);
// render small preview in TL corner
image(pg,0,0);
}
请注意,我已将PGraphics分辨率设置为较小的20倍,然后将其放大绘制,以便更轻松地查看像素在PGraphics上的位置。我没有缩放mouseX,mouseY
坐标,因此测试时需要绘制左上方的小预览。 0.75
的距离确实可以解决问题:根据我的测试,小于0.7499995
的物体会再次开始越野。