首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opengl的模板似乎没有效果。

opengl的模板似乎没有效果。
EN

Stack Overflow用户
提问于 2014-09-12 00:32:17
回答 1查看 484关注 0票数 2

我试图通过创建一个坚实的白色矩形,用黑色矩形勾勒出它的轮廓,并将圆圈放置在角落中,从而创建稍微圆润的矩形--这个想法是游戏中的平台。为了保持简单,我的问题本质上是这样的:How to set blend function on opengl for two overlapping objects

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

平台对象的呈现函数如下所示:

代码语言:javascript
复制
    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);

内部,左,下,上,右都是我自己的多边形类的对象,它基本上只绘制给定多边形的三角形(实际上,现在它只能绘制我刚刚意识到的矩形.但我离题了)

据我所知,这就是我的程序应该如何工作的方式:

  1. 模具测试是打开的,然后我对glStencilFunc和glStencilOp的第一次调用也会将模板缓冲区上的区域更改为1。
  2. 绘制平台的内部矩形。这个区域现在应该是模具缓冲区上的全部1s。
  3. 对glStencilFunc的调用现在可以防止绘制模板值为1的区域。
  4. 平台的边界是画出来的。从技术上讲,这些矩形将内部矩形重叠到边框宽度的一半,但是由于内部矩形在模具缓冲区上都是1s,所以不应该在那里绘制任何东西。
  5. 最后,我会在拐角上画圆圈。(这就是为什么绘制边界线也应该将这些区域更改为模具缓冲区中的所有1s )。

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

EN

回答 1

Stack Overflow用户

发布于 2014-09-12 02:52:41

若要使用模具功能,框架缓冲区必须具有模具缓冲区。由于大多数应用程序没有使用模具缓冲区,默认情况下,您将得到一个没有模板的框架缓冲区。为了确保您有一个模具缓冲区,您需要显式地请求它。

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

在阅读文档时,这是LWJGL中 class的一部分。用于创建PixelFormat

代码语言:javascript
复制
PixelFormat pixFmt = new PixelFormat().withStencilBits(8);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25798964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档