gpt4 book ai didi

c - Opengl 光照和法线

转载 作者:行者123 更新时间:2023-11-30 20:14:36 26 4
gpt4 key购买 nike

我目前正在尝试 opengl 和 glut。因为我不知道自己在做什么,所以我完全搞乱了灯光。完整的可编译文件可以在这里找到:main.c

我有一个显示循环,当前的运行方式如下:

glutDisplayFunc(也是空闲函数):

  1. glClear GL_COLOR_BUFFER_BIT and GL_DEPTH_BUFFER_BIT
  2. switch to modelview matrix
  3. load identity
  4. first Rotate and then Translate according to my keyboard and mouse inputs for the camera
  5. draw a ground with glNormal 0,1,0 and glMaterial on front and back, which is encapsulated by push/popmatrix
  6. pushmatrix
  7. translate
  8. glutSolidTeapod
  9. popmatrix
  10. do lighting related things, glEnable GL_LIGHTING and LIGHT0 and passing
    float pos[] = {0.1,0.1,-0.1,0.1}; glLightfv( GL_LIGHT0, GL_POSITION, pos );
  11. swap the buffers

相关函数glutReshapeFunc 运行(这来自 lighthouse3d.com glut 教程):

  1. calculate the ratio of the screen
  2. switch to projection matrix
  3. loadidentity
  4. set the viewport
  5. set the perspective
  6. switch to modelview matrix

然而这一切似乎都在某种程度上起作用,但当我启用照明时,法线似乎完全困惑了。 gl_lighting1

我的 GL_LIGHT0 似乎保持应有的状态,因为我可以看到地面上的光点当我四处走动时不动 gl_lighting2

如果我移动相机,茶荚纹理似乎也会移动,茶荚本身静止不动。

这里有一些视觉 Material 来解释它,我为我的英语不好而道歉:/

Link to YouTube video describing visually

最佳答案

您的代码中有一系列错误:

  1. 您没有正确设置 OpenGL 窗口的属性:

    glutCreateWindow (WINTITLE);
    glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutInitDisplayMode 只会影响您在此之后创建的任何窗口。您应该交换这两行。

  2. 您从未启用深度测试。您应该在创建窗口后添加glEnable(GL_DEPTH_TEST)。不使用深度测试会解释茶壶产生的奇怪的“透明”效果。

  3. 您有以下代码

    glEnable (GL_CULL_FACE | GL_CULL_FACE_MODE);

    这在两个方面是错误的:GLenum 不是单个位,而只是值。你不能将它们“或”在一起并期望发生任何有用的事情。我不知道这个特定的调用是否会启用您不期望的功能,或者只是生成错误。

    这里的第二个问题是 GL_CULL_FACE_MODE 甚至不是要启用的有效枚举。

    就您而言,您要么完全跳过CULL_FACE,要么应该编写

    glEnable (GL_CULL_FACE);
    glFrontFace(GL_CW);

    后一个调用将面方向从 OpenGL 的默认逆时针规则更改为顺时针规则,因为 GLUT 茶壶就是这样定义的。有趣的是,您的地板也是按照该规则绘制的,因此它将适合您的整个场景。最起码到现在。

  4. 您还没有完全理解 GL 状态机的工作原理。您绘制场景并然后设置照明。但这不会对已经绘制的对象产生影响。它只会影响您下次绘制某些内容时,该内容将在此处的下一帧中。现在,固定功能管道的照明在眼睛空间中起作用。这意味着,如果您想要一个位于世界上固定位置的光源,而不是相对于相机的固定位置,则每次相机都必须使用更新的模型 View 矩阵重新指定光源位置移动。在您的情况下,当相机移动时,光源将落后一帧。这可能不明显,但原则上仍然是错误的。您应该将 display() 函数重新排序为

    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity();
    control (WALKSPEED, MOUSESPEED, mousein);
    lightHandler();
    drawhelpgrid(1, 20);
    drawTeapod();
    glutSwapBuffers();

通过这些更改,我实际上可以在系统上获得点燃的茶壶的预期结果。但正如我附注的那样,我觉得有必要警告您,您的几乎所有代码都依赖于 OpenGL 的已弃用功能。这些内容已从现代版本的 OpenGL 中删除。如果您现在开始学习 OpenGL,您应该考虑学习现代可编程管道,而不是几十年前过时的东西。

关于c - Opengl 光照和法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25823206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com