在OpenGL中内置多边形裁剪

时间:2016-05-06 11:44:47

标签: opengl clipping viewing

有人可以帮助我理解为什么下面的代码在Quad前面显示三角形?对于module.config和。{ gluLookAt(10, 10, 60, 0, 0, 0, 0, 1, 0)

预期输出:因为三角形的'z'值小于四边形而观察者在+ ive'z'轴上的值为60。因此,矩形应该是整体可见的,只有三角形的部分可见。

glOrtho(-30, 30, -30, 30, 0, 90)

2 个答案:

答案 0 :(得分:1)

首先,你的问题与剪辑完全无关 - 剪辑意味着计算初始值与某些剪辑区域或剪辑音量的交集。

三角形确实出现,因为你在四边形之后绘制了。默认情况下,OpenGL不会应用任何visibility algorithms。但是,OpenGL确实以Z buffer algorithm的形式支持depth test

答案 1 :(得分:0)

所以最后我得到了答案。 它需要添加几行代码。

  1. 在初始化步骤中添加以下3行

    glClearDepth(1.0F); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST);

  2. 初始化显示模式以添加深度信息(GLUT_DEPTH),如下所示

    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);

  3. 下面是显示矩形背后的矩形的完整代码。

    #include <GL/glut.h>
    #include <stdlib.h>
    #include <math.h>
    #include<iostream>
    
    using namespace std;
    
    void FPS(void);
    
    GLint gFramesPerSecond = 0;
    int TIMER_SPEED = 10000;
    
    float i = 40;
    void display(void)
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
    
        gluLookAt(10, 10, i-=.2, 10, 10, -10, 0, 1, 0);
    
        glBegin(GL_LINES);
            glColor3f(1, 0, 0);
            glVertex3f(0, 0, 0); glVertex3f(20, 0, 0);
    
            glColor3f(0, 1, 0);
            glVertex3f(0, 0, 0); glVertex3f(0, 20, 0);
    
            glColor3f(0, 0, 1);
            glVertex3f(0, 0, 0); glVertex3f(0, 0, 50);
        glEnd();
    
        glBegin(GL_QUADS);
            glColor3f(1, 1, 1); 
            glVertex3f(10, 10, 10); glVertex3f(20, 10, 15); glVertex3f(20, 20, 15); glVertex3f(10, 20, 15);
        glEnd(); 
    
        glBegin(GL_TRIANGLES);
            glColor3f(0, 1, 0);
    
            glVertex3f(12, 12, 20);
            glVertex3f(22, 14, 12);
            glVertex3f(16, 22, 12);
        glEnd();
        glutSwapBuffers();
    }
    
    void timer(int v)
    {
        static GLfloat u = 0.0;
        u += 0.01;
        glutTimerFunc(TIMER_SPEED/60.0, timer, ++v);
        display();
    }
    
    void Init(void)
    {
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClearDepth(1.0f);
        glDepthFunc(GL_LESS);
        glEnable(GL_DEPTH_TEST);
    }
    
    void Resize(int width, int height)
    {
        glViewport(0, 0, width, height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum(-15, 30, -15, 30, 15, 40);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
    
    int main(int argc, char **argv)
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);
        glutInitWindowSize(640, 480);
        glutInitWindowPosition(200, 200);
        glutCreateWindow("3D Object in OpenGL");
    
       glutKeyboardFunc(myKeyboard);
        Init();
        glutDisplayFunc(display);
        glutReshapeFunc(Resize);
        glutTimerFunc(100, timer, 0);
        glutMainLoop();
        return 0;
    }