我试图创建略微圆角的矩形 - 想法是这些将成为游戏中的平台 - 通过创建一个纯白色矩形,用黑色矩形勾勒出它,并在角落中放置圆圈。为了简单起见,我的问题与此基本相同: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类的对象,它基本上只绘制给定多边形的三角形(实际上,现在它只能绘制我刚才意识到的矩形......但是我离题)
据我所知,这就是我的计划应该如何运作:
所以,我觉得我已经完成了我的研究,但它确实没有用。为了使模板工作,我可能会缺少三个主要的OpenGL功能吗?
答案 0 :(得分:1)
要使用模板功能,帧缓冲区必须具有模板缓冲区。由于大多数应用程序不使用模板缓冲区,因此默认情况下,您将主要获得没有模板的帧缓冲区。要确保您有模板缓冲区,您需要明确请求它。
如何请求模板缓冲区取决于平台和窗口系统接口。它总是需要在初始化期间完成,并且是设置上下文和渲染表面的一部分。在指定所需缓冲区的过程中使用的典型术语是像素格式"和"配置"。
通过阅读文档,这被指定为LWJGL中PixelFormat
class的一部分。用于创建PixelFormat
:
PixelFormat pixFmt = new PixelFormat().withStencilBits(8);
然后,可以将此PixelFormat
实例传递给Display
class的create()
方法重载之一。