簡體   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