OpenGL 正交投影裁剪

发布于 2024-11-26 15:16:52 字数 537 浏览 2 评论 0原文

假设我使用正交投影,并且具有如下所示的重塑功能:

void reshape(f32 width, f32 height){
    aspect = width/height;
    glViewport(0, 0, width, height);
    // guaranted 960x640 HUD canvas
    if(640*aspect>=960){
        ortho.x = 640*aspect;
        ortho.y = 640;
    }else{
        ortho.x = 960;
        ortho.y = 960/aspect;
    }
    glOrtho(0, ortho.x, ortho.y, 0, -1.0f, 1.0f);
}

我如何确保所有顶点> ortho.x或> ortho.y(通常在屏幕外)都没有绘制? 因为如果我将窗口缩放到纵横比大于 1.5f (960/640) 的值,我会看到对象,但它不应该完全可见(因为视口与窗口一样大)。 正交投影中有类似剪切窗格的东西吗?

Assuming I use Orhographic Projection, and have a reshape function like this:

void reshape(f32 width, f32 height){
    aspect = width/height;
    glViewport(0, 0, width, height);
    // guaranted 960x640 HUD canvas
    if(640*aspect>=960){
        ortho.x = 640*aspect;
        ortho.y = 640;
    }else{
        ortho.x = 960;
        ortho.y = 960/aspect;
    }
    glOrtho(0, ortho.x, ortho.y, 0, -1.0f, 1.0f);
}

How can I make sure, that all vertices >ortho.x or >ortho.y (normally offscreen) are didn't drawn?
Because if I scale the windows to something with a bigger aspect ratio than 1.5f (960/640) I see the objects, that schouldn't be full visible (because the viewport is so big like the window).
Is there something like a clipping pane in orthographic projection?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

行雁书 2024-12-03 15:16:52

您想要的是使用 [glScissor][1] 来确保渲染区域永远不会超过特定大小。 glScissor 在窗口坐标中获取一个矩形(记住:窗口坐标的原点位于左下角)。剪刀测试可防止在该区域之外产生碎片。

要激活剪刀测试,您必须使用glEnable(GL_SCISSOR)。除非你这样做,否则上面的调用实际上不会执行任何操作。

What you want is to use [glScissor][1] to ensure that the rendered area never goes beyond a certain size. glScissor takes a rectangle in window coordinates (remember: window coordinates have the origin at the bottom-left). The scissor test prevents the generation of fragments outside of this area.

To activate the scissor test, you must use glEnable(GL_SCISSOR). Unless you do that, the above call won't actually do anything.

零崎曲识 2024-12-03 15:16:52

使用常量值作为 glOrtho 的限制参数,但使用 glViewportglScissor(使用 glEnable(GL_SCISSOR_TEST) 启用)来限制对子对象的渲染- 窗户的一部分。

顺便说一句:您应该在渲染函数中设置投影和视口。在重塑处理程序中执行此操作没有多大意义。在任何严肃的 OpenGL 应用程序中,您都会在完整渲染期间多次切换投影模式,因此从一开始就这样做。

Use constant values for the limit parameters of glOrtho, but use glViewport and glScissor (enable with glEnable(GL_SCISSOR_TEST)) to limit rendering to a sub-portion of your window.

BTW: You should set the projection and viewport in the rendering function. Doing it in the reshape handler makes not much sense. In any serious OpenGL application you'll switch projection modes several times during a full render, so just do it that way from the very beginning.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文