【问题标题】:OpenGL projection question: Why I can't see anything on the screen?OpenGL投影问题:为什么我在屏幕上什么都看不到?
【发布时间】:2011-05-21 21:58:21
【问题描述】:
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();
}

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

【问题讨论】:

  • 我看到的是一个白色背景的空窗口。

标签: opengl glut


【解决方案1】:

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

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

glPushMatrix();
glTranslated(0,0,-5);
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();
glPopMatrix();

【讨论】:

  • 我完全错过了。然而,负值也适用于透视模式。只有在原点才会有一个奇点。投影看起来像两个金字塔顶端相连。
  • @datenwolf 确实,即使 zNear 为负,矩阵数学也可以应用透视。但我想不出深度缓冲区是如何工作的。
  • 对于负转换的 Z 值,您将看到反向深度排序。
【解决方案2】:

gluPrespectivegluLookAt 在所选堆栈上的当前矩阵顶部相乘。您需要先加载身份才能有意义。您还需要在渲染之前设置视口。最佳实践是在显示函数中设置所有矩阵和视口,而不是其他任何地方。坚持这条规则会让你的生活更轻松。同样在 OpenGL 中,通常没有专门的初始化阶段。资源按需加载。

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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    相关资源
    最近更新 更多