【问题标题】:(OpenGL) Clamping large content to smaller area(OpenGL)将大内容限制在较小的区域
【发布时间】:2014-04-06 16:35:04
【问题描述】:

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

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

我知道几种方法,但所有方法都非常痛苦或不合适。

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

引导我。

【问题讨论】:

    标签: java c opengl graphics lwjgl


    【解决方案1】:

    当您的区域保证为轴对齐矩形时,您可以使用glViewport 和/或glScissor(后者与glEnable(GL_SCISSOR_TEST) 一起使用)来防止OpenGL 在该矩形之外渲染。

    在修改视口的情况下,生成的图像会被缩放以适合视口矩形。使用剪刀测试,该区域只是“切掉”,因此不会相对于视口设置进行缩放。但是差异并不重要 - 您可以通过相应地调整转换来通过两条路径获得相同的结果。请注意,如果您在渲染“平铺地图”时需要调用glClear,则清除操作将不受当前设置的视口限制,但剪刀测试甚至可以限制清除。

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

    1. 将模板缓冲区清除为 0。
    2. 只需将您希望平铺地图显示的形状 _only 渲染到模板缓冲区中。
    3. 渲染平铺地图时,启用模板测试并将其设置为丢弃模板缓冲区为 0 的像素的片段。

    第 1 步和第 2 步只需执行一次(只要您的区域或窗口大小没有变化)。请查看 glStencilFuncglStencilOp 函数,了解如何执行此操作的详细信息。

    【讨论】:

    • 太棒了,我知道会有一些技巧。如果它在 LWJGL 中可用,我会试试 glScissor。
    猜你喜欢
    • 1970-01-01
    • 2017-05-05
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多