我正在尝试通过创建一个纯白色矩形,用黑色矩形勾勒它的轮廓,并在角落放置圆形,来创建略微圆角的矩形 - 想法是这些将成为游戏中的平台。为简单起见,我的问题与此基本相同:How to set blend function on opengl for two重叠对象
我想使用模板测试来解决这个问题,因为我已经查过了,这似乎是一个很好的方法。
这是平台对象的渲染函数的样子:
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 类的对象,它基本上只是为给定的多边形绘制三角形(实际上,现在它只能绘制我刚刚意识到的矩形......但我跑题了)
据我了解,这就是我的程序应该如何工作:
- 打开模板测试,然后我第一次调用 glStencilFunc 和 glStencilOp 使绘制的任何内容也将模板缓冲区上的该区域更改为 1。
- 绘制平台的内部矩形。这个区域现在应该在模板缓冲区上全为 1。
- 现在调用 glStencilFunc 可以防止在模板值为 1 的区域上绘图
- 绘制了平台的边界。从技术上讲,这些矩形与内部矩形重叠到边框宽度的一半,但由于内部矩形在模板缓冲区上全为 1,因此不应在此处绘制任何内容。
- 最终,我将在角落渲染圆圈。(这就是为什么绘制边界线也应该将这些区域更改为模板缓冲区中的所有 1)。
所以,我觉得我已经完成了我的研究,但它真的没有用。为了使模板工作,我可能会缺少三个主要的 OpenGL 功能吗?