(OpenGL)将大量内容压缩到较小的区域

时间:2014-04-06 16:35:04

标签: java c opengl graphics lwjgl

我在Java中使用 OpenGL wigh LWJGL ,但这并不重要。我不是要求代码,而是要求提示如何执行此操作。语言无关。

我有一些区域(简单的矩形),而且,比方说,我想在这个区域展示一个大的平铺地图。该区域不是整个屏幕,我想渲染它周围的东西。

enter image description here

我知道很少的方法,但所有这些都是巨大的痛苦或不适合。

  • 渲染整个平铺地图和其他所有内容,包括背景和框架, 在顶部 - 离开窗口。是的,有效,但它会很痛苦。
  • 仅渲染可见图块,仅渲染边框图块的可见部分。 再一次,可行但很难,即。当我使用外部字体绘图库时,我不能只告诉它“嘿,停在这条线上,那是我的边界。”我说的不是很好的方法。
  • 我不知道的一些OpenGL魔法。

指导我。

1 个答案:

答案 0 :(得分:2)

当您的区域保证是轴对齐的矩形时,您可以使用glViewport和/或glScissor(后者与glEnable(GL_SCISSOR_TEST)一起使用)以防止OpenGL在外部呈现那个矩形。

如果要修改视口,则会缩放刚刚生成的图像以适合视口矩形。使用剪刀测试,该区域只是“剪切”#34;因此不会相对于视口设置进行缩放。但差异实际上并不重要 - 你可以通过两条路径得到相同的结果,只需相应地调整你的转换。请注意,如果您需要在渲染"平铺地图时调用glClear,清除操作将不受当前设置视口的限制,但剪刀测试将允许您均匀限制清算。

如果您的区域不能被描述为轴对齐的矩形,我建议您查看模板缓冲区。算法很简单:

  1. 将模板缓冲区清除为0。
  2. 只需渲染您希望平铺地图仅显示在模板缓冲区中的形状。
  3. 渲染平铺地图时,启用模板测试并进行设置,以便丢弃模板缓冲区为0的像素片段。
  4. 步骤1和2只需要完成一次(只要您的区域没有变化,或者你的风大小)。有关如何执行此操作的详细信息,请查看glStencilFuncglStencilOp函数。