如何使用P3D渲染器实现noSmooth()?

时间:2017-03-28 18:25:40

标签: opengl processing jogl

我希望使用P3D渲染器渲染基本的3D形状而不使用PGraphics实例进行任何混叠/平滑,但noSmooth()似乎无法工作。

In OF我记得在纹理上调用setTextureMinMagFilter(GL_NEAREST,GL_NEAREST);

处理中的等价物是什么?

我尝试使用PGL

PGL.TEXTURE_MIN_FILTER = PGL.NEAREST;
PGL.TEXTURE_MAG_FILTER = PGL.NEAREST;

但是我得到了一张黑色图片。 如果我发表评论PGL.TEXTURE_MIN_FILTER = PGL.NEAREST;我可以看到渲染,但它是内插的,而不是锐利的。

这里是一个基本的测试草图,其中包含了我尝试过的一些内容:

PGraphics buffer;
PGraphicsOpenGL pgl;

void setup() {
  size(320, 240, P3D);
  noSmooth();
  //hint(DISABLE_TEXTURE_MIPMAPS);

  //((PGraphicsOpenGL)g).textureSampling(0);

  //PGL pgl = beginPGL();
  //PGL.TEXTURE_MIN_FILTER = PGL.NEAREST;
  //PGL.TEXTURE_MAG_FILTER = PGL.NEAREST;
  //endPGL();

  buffer=createGraphics(width/8, height/8, P3D);
  buffer.noSmooth();
  buffer.beginDraw();
  //buffer.hint(DISABLE_TEXTURE_MIPMAPS);
  //((PGraphicsOpenGL)buffer).textureSampling(0);
  PGL bpgl = buffer.beginPGL();
  //PGL.TEXTURE_MIN_FILTER = PGL.NEAREST;//commenting this back in results in a blank buffer
  PGL.TEXTURE_MAG_FILTER = PGL.NEAREST;
  buffer.endPGL();
  buffer.background(0);
  buffer.stroke(255);
  buffer.line(0, 0, buffer.width, buffer.height);
  buffer.endDraw();
}
void draw() {

  image(buffer, 0, 0, width, height);
}

(我还posted on the Processing Forum,但到目前为止没有运气)

1 个答案:

答案 0 :(得分:2)

你实际上是在正确的轨道上。您只是将错误的值传递给textureSampling()

PGraphicsOpenGL::textureSampling()上的文档以来 至少可以说有点稀缺。 我决定使用反编译器进入峰值,这引导我 Texture::usingMipmaps()。 在那里,我能够看到价值观和反映的内容(在反编译代码中)。

2 = POINT
3 = LINEAR
4 = BILINEAR
5 = TRILINEAR

PGraphicsOpenGL的默认textureSampling5(TRILINEAR)。

我后来发现this old comment on an issue同样确认了它。

因此,要获得点/最近过滤,您只需在应用程序本身上调用noSmooth(),然后在textureSampling()上致电PGraphics

size(320, 240, P3D);
noSmooth();

buffer = createGraphics(width/8, height/8, P3D);
((PGraphicsOpenGL) buffer).textureSampling(2);

考虑到上述情况,并且仅包括用于绘制线条并将buffer绘制到应用程序的代码。然后,这给出了以下期望的结果。