OpenGL投影问题:为什么我可以';你看不到屏幕上的任何东西吗?

OpenGL投影问题:为什么我可以';你看不到屏幕上的任何东西吗?,opengl,glut,Opengl,Glut,有人可以解释一下,并给出如何使三角形可见的建议。gluPrespective和gluplookat在所选堆栈的当前矩阵顶部相乘。您需要首先加载一个标识才能理解。此外,还需要在渲染之前设置视口。最佳做法是在显示功能中设置所有矩阵和视口,而不是在其他任何地方。坚持这条规则会让你的生活轻松很多。在OpenGL中,通常没有专门的初始化阶段。资源按需加载 void init (void) { glClearColor (1.0, 1.0, 1.0, 0.0); //glMatrixMod

有人可以解释一下,并给出如何使三角形可见的建议。

gluPrespective和gluplookat在所选堆栈的当前矩阵顶部相乘。您需要首先加载一个标识才能理解。此外,还需要在渲染之前设置视口。最佳做法是在显示功能中设置所有矩阵和视口,而不是在其他任何地方。坚持这条规则会让你的生活轻松很多。在OpenGL中,通常没有专门的初始化阶段。资源按需加载

void init (void)
{
    glClearColor (1.0, 1.0, 1.0, 0.0);

    //glMatrixMode(GL_MODELVIEW);
    //gluLookAt(x0, y0, z0, xref, yref, zref, Vx, Vy, Vz);

    glMatrixMode(GL_PROJECTION);
    gluPerspective(45, 2, -1, 1);
    //glFrustum(xwMin, xwMax, ywMin, ywMax, dnear, dfar);
    //gluPerspective(45.0, 45, -1, 1);
}

void displayFcn (void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(0.0, 1.0, 0.0);
    glPolygonMode(GL_FRONT, GL_FILL);
    glPolygonMode(GL_BACK, GL_LINE);

    glBegin(GL_TRIANGLES);
        glVertex3f(0.0, 0.0, 0.0);
        glVertex3f(0.1, 0.0, 0.0);
        glVertex3f(0.50, 0.866025, 0.0);    
    glEnd();

    glFlush();
}

void reshapeFcn(GLint newWidth, GLint newHeight)
{
    glViewport(0,0,newWidth, newHeight);

    winWidth = newWidth;
    winHeight = newHeight;

}
void main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(400,200);
    glutInitWindowSize(winWidth, winHeight);
    glutCreateWindow("Test");

    init();
    glutDisplayFunc(displayFcn);
    glutReshapeFunc(reshapeFcn);
    glutMainLoop();
}
gluPrespective和gluLookAt在选定堆栈的当前矩阵顶部相乘。您需要首先加载一个标识才能理解。此外,还需要在渲染之前设置视口。最佳做法是在显示功能中设置所有矩阵和视口,而不是在其他任何地方。坚持这条规则会让你的生活轻松很多。在OpenGL中,通常没有专门的初始化阶段。资源按需加载

void init (void)
{
    glClearColor (1.0, 1.0, 1.0, 0.0);

    //glMatrixMode(GL_MODELVIEW);
    //gluLookAt(x0, y0, z0, xref, yref, zref, Vx, Vy, Vz);

    glMatrixMode(GL_PROJECTION);
    gluPerspective(45, 2, -1, 1);
    //glFrustum(xwMin, xwMax, ywMin, ywMax, dnear, dfar);
    //gluPerspective(45.0, 45, -1, 1);
}

void displayFcn (void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(0.0, 1.0, 0.0);
    glPolygonMode(GL_FRONT, GL_FILL);
    glPolygonMode(GL_BACK, GL_LINE);

    glBegin(GL_TRIANGLES);
        glVertex3f(0.0, 0.0, 0.0);
        glVertex3f(0.1, 0.0, 0.0);
        glVertex3f(0.50, 0.866025, 0.0);    
    glEnd();

    glFlush();
}

void reshapeFcn(GLint newWidth, GLint newHeight)
{
    glViewport(0,0,newWidth, newHeight);

    winWidth = newWidth;
    winHeight = newHeight;

}
void main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(400,200);
    glutInitWindowSize(winWidth, winHeight);
    glutCreateWindow("Test");

    init();
    glutDisplayFunc(displayFcn);
    glutReshapeFunc(reshapeFcn);
    glutMainLoop();
}

我不认为你可以设置“zNear”为负数。这会对深度缓冲区产生奇怪的影响,意味着你会看到眼睛后面的东西。如果将纵横比固定为2,则无论窗口的纵横比如何,也可能会得到一些奇怪的结果

您还需要将当前矩阵设置回MODEL_视图,如DatenWalf所示。您不需要使用gluLookAt,但需要做一些事情将三角形从眼睛所在的原点移开。可以通过将z分量设置为负值,或在顶点之前应用平移来实现:

void displayFcn (void)
{
    glViewport(0,0,winWidth, winHeight);

    glClearColor (1.0, 1.0, 1.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 2, 1, 10);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(x0, y0, z0, xref, yref, zref, Vx, Vy, Vz);

    glColor3f(0.0, 1.0, 0.0);
    glPolygonMode(GL_FRONT, GL_FILL);
    glPolygonMode(GL_BACK, GL_LINE);

    glBegin(GL_TRIANGLES);
        glVertex3f(0.0, 0.0, 0.0);
            glVertex3f(0.1, 0.0, 0.0);
        glVertex3f(0.50, 0.866025, 0.0);    
    glEnd();

    glFinish();
}

void reshapeFcn(GLint newWidth, GLint newHeight)
{
    winWidth = newWidth;
    winHeight = newHeight;
    glutPostRedisplay();
}

void main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(400,200);
    glutInitWindowSize(winWidth, winHeight);
    glutCreateWindow("Test");

    glutDisplayFunc(displayFcn);
    glutReshapeFunc(reshapeFcn);
    glutMainLoop();
}

我不认为你可以设置“zNear”为负数。这会对深度缓冲区产生奇怪的影响,意味着你会看到眼睛后面的东西。如果将纵横比固定为2,则无论窗口的纵横比如何,也可能会得到一些奇怪的结果

您还需要将当前矩阵设置回MODEL_视图,如DatenWalf所示。您不需要使用gluLookAt,但需要做一些事情将三角形从眼睛所在的原点移开。可以通过将z分量设置为负值,或在顶点之前应用平移来实现:

void displayFcn (void)
{
    glViewport(0,0,winWidth, winHeight);

    glClearColor (1.0, 1.0, 1.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 2, 1, 10);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(x0, y0, z0, xref, yref, zref, Vx, Vy, Vz);

    glColor3f(0.0, 1.0, 0.0);
    glPolygonMode(GL_FRONT, GL_FILL);
    glPolygonMode(GL_BACK, GL_LINE);

    glBegin(GL_TRIANGLES);
        glVertex3f(0.0, 0.0, 0.0);
            glVertex3f(0.1, 0.0, 0.0);
        glVertex3f(0.50, 0.866025, 0.0);    
    glEnd();

    glFinish();
}

void reshapeFcn(GLint newWidth, GLint newHeight)
{
    winWidth = newWidth;
    winHeight = newHeight;
    glutPostRedisplay();
}

void main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(400,200);
    glutInitWindowSize(winWidth, winHeight);
    glutCreateWindow("Test");

    glutDisplayFunc(displayFcn);
    glutReshapeFunc(reshapeFcn);
    glutMainLoop();
}

我看到的是一个白色背景的空窗口。我看到的是一个白色背景的空窗口。我错过了。但是,负值也可以在透视模式下工作。只有在那里的原点“这将是一个奇点。投影看起来像两个金字塔在顶端相连。@datenwolf确实,矩阵数学可以应用透视图,即使zNear为负值。但是我想不出深度缓冲区是如何工作的。对于负转换的Z值,你会看到倒置的深度排序。我忽略了这一点。但是,负值也可以在透视模式下工作。只有在原点才会有奇点。投影看起来像两个金字塔连接在它们的顶端。@datenwolf确实,即使zNear为负,矩阵数学也可以应用透视图。但是我想不出深度缓冲区可能如何工作。对于负转换的Z值,您将看到反向深度排序。