繁体   English   中英

使用平截头体时的OpenGL远剪切

[英]OpenGL far clipping when using frustum

我正在使用GLFW + OpenGL尝试制作“旋转立方体”。 尽管大多数都能正常工作,但我在远端进行了裁剪。 我尝试将视锥的值更改为非常大的数字,但这似乎没有效果。

int main(void) {
    if (!glfwInit()) exit(EXIT_FAILURE);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
    glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
    GLFWwindow* window = glfwCreateWindow(640, 360, "3dTest", NULL, NULL);
    if (!window) {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }
    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);

    glClearColor(0.5f, 0.5f, 0.5f, 1.0f);   // Grey Background
    float rotqube = 0;
    while (!glfwWindowShouldClose(window)) {
        // clear color and depth buffer for new frame
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        // set up camera
        glViewport(0, 0, 640, 360);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum(-100.0, 100.0, -100.0, 100.0, 100.0, -100.0);

        // position camera
        glTranslatef(0.0f, 0.0f, -2.0f);    // Translate Into The Screen 2.0 Units
        glRotatef(rotqube, 0.0f, 1.0f, 0.0f);   // Rotate The cube around the Y axis
        glRotatef(rotqube, 1.0f, 1.0f, 1.0f);

        glBegin(GL_QUADS);      // Draw The Cube Using quads
        glColor3f(0.0f, 1.0f, 0.0f);    // Color Blue
        glVertex3f(1.0f, 1.0f, -1.0f);  // Top Right Of The Quad (Top)
        glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Top)
        glVertex3f(-1.0f, 1.0f, 1.0f);  // Bottom Left Of The Quad (Top)
        glVertex3f(1.0f, 1.0f, 1.0f);   // Bottom Right Of The Quad (Top)
        ...
        glColor3f(1.0f, 0.0f, 1.0f);    // Color Violet
        glVertex3f(1.0f, 1.0f, -1.0f);  // Top Right Of The Quad (Right)
        glVertex3f(1.0f, 1.0f, 1.0f);   // Top Left Of The Quad (Right)
        glVertex3f(1.0f, -1.0f, 1.0f);  // Bottom Left Of The Quad (Right)
        glVertex3f(1.0f, -1.0f, -1.0f); // Bottom Right Of The Quad (Right)
        glEnd();            // End Drawing The Cube

        rotqube += 0.3f;

        //Swap buffer and check for events
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwDestroyWindow(window);
    glfwTerminate;
    exit(EXIT_SUCCESS);
    return 0;
}

看起来是这样的:

这就是它的样子

glFrustum(-100.0, 100.0, -100.0, 100.0, 100.0, -100.0);
                                               ^ wat

glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal)

参数:

  • leftright

    指定左右垂直剪切平面的坐标。

  • bottomtop

    指定底部和顶部水平裁剪平面的坐标。

  • nearValfarVal

    指定到近景和远景裁剪平面的距离。
    两个距离都必须为正。

尝试类似0.1100.0

glFrustum(-100.0, 100.0, -100.0, 100.0, 0.1, 100.0);

您根本没有使用透视投影。 您的来电

 glFrustum(-100.0, 100.0, -100.0, 100.0, 100.0, -100.0); 

除了设置GL_INVALID_VALUE错误状态外, 没有任何作用

OpenGL 2.0规范第2.11节“坐标转换”所述:

对于

 void Frustum( double l, double r, double b, double t, double n, double f ); 

坐标(l, b, −n)^T(r, t, −n)^T指定分别在近裁剪平面上映射到窗口左下角和右上角的点(假设眼睛位于(0, 0, 0)^T )。 f给出了从眼睛到远裁剪平面的距离。 如果nf小于或等于零l等于rb等于tn等于f则会产生错误INVALID_VALUE

尝试在近平面或远平面之一位于摄影机后面的位置设置投影没有丝毫意义,并且会在渲染过程中导致很多数学上的奇数(即,将位于摄影机平面上的顶点除以零),因此这个不允许。

由于此函数会因错误而失败,因此您将使用单位矩阵作为投影矩阵,并且最终以正交投影结束。

编写完所有这些内容之后,我必须使您知道所有这些内容已经完全过时了。 固定功能流水线和GL矩阵堆栈,包括类似功能glFrustumglLoadIdendityglRotate使用,和立即模式渲染glBegin / glEnd被弃用,大约十年已经被去除的OpenGL形式芯轮廓。 尝试在2018年学习这些知识是一个非常糟糕的主意,我强烈建议您改为学习现代OpenGL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM