OpenGL透视和照明不起作用?

Posted

技术标签:

【中文标题】OpenGL透视和照明不起作用?【英文标题】:OpenGL perspective and lighting not working? 【发布时间】:2011-08-18 09:47:43 【问题描述】:

编辑:有些人说使用 glNormal3f() 来解决我的照明问题,但我刚刚研究并实施了它,它并没有改变任何东西。

我是 OpenGL 的新手,所以我想我做错了什么,但我尽可能地遵循红皮书中的示例,但我无法弄清楚出了什么问题,所以我想我想问问你们。

我有两个问题。一个是,即使我确定我正确使用了 glFrustum,它仍然会渲染正交场景,并且由于某种原因它会渲染相机前后的对象。另一个是,即使我很确定我在做这个照明是正确的(因为我按照书中的例子),它用统一的颜色照亮场景,没有阴影或任何东西。这是我的代码:

#include "GraphicsManager.h"
#include <GL/gl.h>

void GraphicsManager::initialize () 
  fx = 0;
  fy = 0;  
  glEnable (GL_LIGHTING);
  glEnable (GL_LIGHT0);
  glDepthFunc (GL_LEQUAL);
  glEnable (GL_DEPTH_TEST);
  glViewport (0, 0, 800, 600);
  glMatrixMode (GL_PROJECTION);
  glLoadIdentity ();
  glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
  glMatrixMode (GL_MODELVIEW);
  glLoadIdentity ();


int GraphicsManager::draw (std::vector<float> buttoninfo) 
  // changing light_position makes no difference
  GLfloat light_position[] =  1.0, 1.0, 1.0, 1.0 ;
  int i, j, k;
  fx += buttoninfo[0];
  fy += buttoninfo[1];
  glClearColor (0.0, 0.0, 0.0, 1.0);
  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glColor3f (0.5, 0.5, 0.8);
  glLoadIdentity ();
  glLightfv (GL_LIGHT0, GL_POSITION, light_position);�
  glRotatef (buttoninfo[3], 1.0, 0.0, 0.0);
  glRotatef (buttoninfo[2], 0.0, 1.0, 0.0);
  glTranslatef (-fx, 0, -fy);
  for (i = 0; i < 5; i ++) 
  for (j = 0; j < 5; j ++) 
  for (k = 0; k < 5; k ++) 
    glPushMatrix ();
    glTranslatef (i, j, k);
    glBegin (GL_TRIANGLE_FAN);
      glVertex3f (0.0, 0.5, 0.0);
      glVertex3f (-0.5, -0.5, -0.5);
      glVertex3f (-0.5, -0.5, 0.5);
      glVertex3f (0.5, -0.5, 0.5);
      glVertex3f (0.5, -0.5, -0.5);
      glVertex3f (-0.5, -0.5, -0.5);
    glEnd ();
    glPopMatrix ();
  
  
  
  glFlush ();
  return (int)buttoninfo[5];

你能帮我找出问题所在吗?提前致谢。

【问题讨论】:

我不知道为什么您的投影是错误的,但是没有法线您将无法获得适当的照明(在每次调用 glVertex3f 之前先调用 glNormal3f)。 要处理光照,您需要提供法线和顶点。请参阅 glNormal3f 的用法。 【参考方案1】:

您正在围绕原点 (0,0,0) 绘制元素,但一开始并没有移动“相机”。所以你是从场景的原点看的,它在你的元素内部。

试试看

glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
glTranslate3f(0, 0, -10); 

努力解决

对于透视渲染,请考虑使用 gluPerspective。 http://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml

【讨论】:

这使得它根本没有渲染。另外,我正在使用 glTranslatef(-fx, 0, -fy) 命令将我的“相机”从原点移开。并且使用 gluPerspective() 代替 glFrustum() 没有区别。 啊,我在你的代码中没有看到。也许是因为你执行的旋转?如果我现在不打算完成我的学士论文,我会试试那个代码...... 不,那是场景旋转,它应该在那里。有一些我没有展示的 SDL 代码基本上使它成为一个第一人称射击类型的系统,并且角度和移动工作正常,问题是它是正交的。实际上我可以对投影矩阵做任何事情,它不会改变任何事情,就像它甚至没有读取它......即使我知道它运行初始化函数...... 您确定在渲染每一帧之前都会调用初始化函数吗? 必须这样吗?我的印象是你只调用一次,它会设置一切,直到你改变它......我会在每一帧都调用它,看看是否有帮助......哇,谢谢,这肯定有助于照明。不过,投影似乎没有什么不同。

以上是关于OpenGL透视和照明不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL第一个立方体渲染不起作用

OpenGL First Cube渲染不起作用

简单的 OpenTK 着色器不起作用

同步数据透视表 - VBA 代码不起作用

使用 SDL 和 openGL 绘图原语不起作用

OpenGL - 链接两个纹理不起作用