OpenGL裁剪Z> 1.0

时间:2012-03-29 19:13:20

标签: c++ opengl clipping

由于某些原因,我无法在openGL中绘制超过z> 1的内容。 Z缓冲区工作正常,我现在已经坚持了一段时间。 我认为问题是gluPerspective,但它仍然无法正常工作。 我可以看到介于0和1之间的任何内容,代码的三角形会被剪切掉。 抱歉我的英语很差。

#include <iostream>
#include <GL/glut.h>

using namespace std;

void idle() {
    glutPostRedisplay();
}

void changeSize(int w, int h) {

    // Prevent a divide by zero, when window is too short
    // (you cant make a window of zero width).
    if(h == 0)
        h = 1;
    float ratio = 1.0* w / h;

    // Use the Projection Matrix
    glMatrixMode(GL_PROJECTION);

        // Reset Matrix
    glLoadIdentity();

    // Set the viewport to be the entire window
    glViewport(0, 0, w, h);

    // Set the correct perspective.
    gluPerspective(0, ratio, 0.1, 1000.0);

    // Get Back to the Modelview
    glMatrixMode(GL_MODELVIEW);
}

void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();

    glBegin(GL_TRIANGLES);
        glVertex3f(-0.5,-0.5,0.0);
        glVertex3f(0.5,0.0,0.0);
        glVertex3f(0.0,0.5,2.0);
    glEnd();

    glutSwapBuffers();
}

int main(int argc, char **argv) {

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(800,600);
    glutCreateWindow("OpenGL");

    glutDisplayFunc(renderScene);
    glutReshapeFunc(changeSize);
    glutIdleFunc(idle);

    glEnable(GL_DEPTH_TEST);

    glutMainLoop();

    return 0;
}

1 个答案:

答案 0 :(得分:4)

首先,gluPerspective的{​​{1}}值为零,这完全是荒谬的。尝试为视野设置一个标称值(可能是60)。

其次,修复后,我不认为你的三个顶点中的任何一个都应该是可见的。如果您没有视图矩阵(没有显示),前两个顶点应该被近平面剪切。对于第三个顶点,您可能意味着它为-2而不是2(默认眼睛向下看负z轴)。所以这个顶点也在眼睛后面。

坦率地说,我很惊讶你能够看到任何东西,但看看纠正这些事情是否有帮助。尝试使用-0.2,-0.2和-2.0的z值绘制三角形。