【问题标题】:opengl stencils seem to have no effectopengl 模板似乎没有效果
【发布时间】:2014-11-06 01:58:44
【问题描述】:

我正在尝试创建略微圆角的矩形 - 想法是这些将成为游戏中的平台 - 通过创建一个纯白色矩形,用黑色矩形勾勒它的轮廓,并在角落放置圆形。为简单起见,我的问题与此基本相同:How to set blend function on opengl for two overlapping objects

我想使用模板测试来解决这个问题,因为我已经查过了,这似乎是一个很好的方法。

这是平台对象的渲染函数的样子:

    GL11.glClear(GL11.GL_STENCIL_BUFFER_BIT);

    // Setup stencil such that stencil = 0x01 isn't drawn over
    GL11.glEnable(GL11.GL_STENCIL_TEST);
    GL11.glStencilFunc(GL11.GL_ALWAYS, 1, 0xFF); // Do not draw if stencil byte = 1
    GL11.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE);
    // stencil is on (mask is all 1s)
    GL11.glStencilMask(0xFF);
    inside.render(st);

    GL11.glStencilFunc(GL11.GL_EQUAL, 1, 0xFF); // Do not draw if stencil byte = 1
    left.render(st);
    bottom.render(st);
    top.render(st);
    right.render(st);

    GL11.glDisable(GL11.GL_STENCIL_TEST);

inside、left、bottom、top、right 都是我自己的 Polygon 类的对象,它基本上只是为给定的多边形绘制三角形(实际上,现在它只能绘制我刚刚意识到的矩形......但我离题)

据我了解,我的程序应该是这样工作的:

  1. 模板测试已打开,然后我第一次调用 glStencilFunc 和 glStencilOp 使绘制的任何内容也将模板缓冲区上的该区域更改为 1。
  2. 绘制了平台的内部矩形。这个区域现在应该在模板缓冲区上全为 1。
  3. 现在调用 glStencilFunc 可以防止在模板值为 1 的区域上绘图
  4. 绘制了平台的边界。从技术上讲,这些矩形与内部矩形重叠到边框宽度的一半,但由于内部矩形在模板缓冲区上全为 1,因此不应在此处绘制任何内容。
  5. 最终,我将在角落渲染圆圈。 (这就是为什么绘制边界线也应该在模板缓冲区中将这些区域更改为全 1)。

所以,我觉得我已经完成了我的研究,但它真的没有用。为了使模板工作,我可能会缺少三个主要的 OpenGL 功能吗?

【问题讨论】:

标签: java opengl lwjgl stencil-buffer


【解决方案1】:

要使用模板功能,您的帧缓冲区必须有模板缓冲区。由于大多数应用程序不使用模板缓冲区,默认情况下您将获得一个没有模板的帧缓冲区。为了确保你有一个模板缓冲区,你需要明确地请求它。

如何请求模板缓冲区取决于平台和窗口系统接口。它总是需要在初始化期间完成,并且是设置上下文和渲染表面的一部分。在指定所需缓冲区的过程中使用的典型术语是“像素格式”和“配置”。

通过阅读文档,这被指定为 LWJGL 中 PixelFormat class 的一部分。用于创建PixelFormat

PixelFormat pixFmt = new PixelFormat().withStencilBits(8);

然后可以将此PixelFormat 实例传递给Display classcreate() 方法重载之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2018-05-18
    • 1970-01-01
    • 2010-12-24
    • 2020-07-04
    • 2020-04-11
    相关资源
    最近更新 更多