c++ - OpenGL 裁剪 Z>1.0

标签 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;
}

最佳答案

首先,您的gluPerspectivefovy 的值为零,这是完全没有意义的。尝试为视野设置一个标称值(可能是 60)。

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

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

关于c++ - OpenGL 裁剪 Z>1.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9931912/

相关文章:

c++ - GCC:使用 -Werror 但将特定错误降级为警告(在命令行中)

opengl - 如何将法线打包到GL_INT_2_10_10_10_REV

objective-c - 我应该如何将自定义 NSView 包装在 NSScrollView 中?

c# - 绘制裁剪图像时可以抗锯齿吗?

c++ - 在 C++ 中创建一个指向另一个元素的 vector

c++ - 重新执行失败的 IO 操作是否有任何效果?

c++ - OpenGL Quad 不绘图

c++ - 在 OpenGL 中重新组织图像/图片数组以适应 2 次方纹理大小

java - 从图像中剪切形状

c++ - boost日志文件无法创建sample.log文件