Java opengl模板似乎没有效果

Java opengl模板似乎没有效果,java,opengl,lwjgl,stencil-buffer,Java,Opengl,Lwjgl,Stencil Buffer,我试图创建一个稍微圆一些的矩形——其想法是,这些将是游戏中的平台——通过创建一个纯白的矩形,用黑色矩形勾勒出它的轮廓,并在角落中放置圆圈。为了简单起见,我的问题基本上与此相同: 我想用模板测试来解决这个问题,因为我已经查过了,这似乎是一个很好的方法 这是平台对象的渲染函数的外观: GL11.glClear(GL11.GL_STENCIL_BUFFER_BIT); // Setup stencil such that stencil = 0x01 isn't drawn over

我试图创建一个稍微圆一些的矩形——其想法是,这些将是游戏中的平台——通过创建一个纯白的矩形,用黑色矩形勾勒出它的轮廓,并在角落中放置圆圈。为了简单起见,我的问题基本上与此相同:

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

这是平台对象的渲染函数的外观:

    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);
内部、左侧、底部、顶部和右侧都是我自己的多边形类的对象,基本上只是绘制给定多边形的三角形(实际上,现在它只能绘制我刚刚意识到的矩形……但我离题了)

据我所知,我的程序应该是这样工作的:

  • Stencil test处于启用状态,然后我对glStencilFunc和glStencilOp的第一次调用使绘制的任何内容也将模具缓冲区上的区域更改为1
  • 绘制平台的内部矩形。该区域现在应该是模具缓冲区上的所有1
  • 现在,调用glStencilFunc可防止在模具值为1的区域上绘制
  • 绘制平台的边界。从技术上讲,这些矩形在边框宽度的一半处与内部矩形重叠,但由于内部矩形在模具缓冲区上都是1,因此不应在那里绘制任何内容
  • 最终,我将在角上渲染圆。(这就是为什么绘制边界线也应该将这些区域更改为模具缓冲区中的所有1)

  • 所以,我觉得我已经做了我的研究,但它真的不起作用。为了使模具工作,我可能缺少三个主要的OpenGL功能吗?

    要使用模具功能,您的帧缓冲区必须具有模具缓冲区。由于大多数应用程序不使用模具缓冲区,因此默认情况下,您将获得一个没有模具的帧缓冲区。要确保有模具缓冲区,需要显式请求它

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

    通过阅读文档,这是LWJGL中的一部分。用于创建
    像素格式

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

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

    初始化期间是否请求模具缓冲区?看,嘿,看那个;它起作用了!:D谢谢!现在我知道我的模具也是倒的,但那并不重要。