c++ - OpenGL 透视和光照不工作?

标签 c++ opengl perspective lighting

编辑:一些人说使用 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];
}

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

最佳答案

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

试试看

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

努力修复它

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

关于c++ - OpenGL 透视和光照不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7105449/

相关文章:

python - PyOpenGL glLookAt 在第一次调用后表现怪异,参数相同

C++ Lambda : Difference between "mutable" and capture-by-reference

c++ - 给char赋负值

c++ - 使用 c++17 的弱绑定(bind)

opengl - 是否还有 OpenGL 1.2 的教程?

javascript - 使用 jquery 创建透视对象

Eclipse Luna 在调试遇到断点时给出 NullPointerException

c++ - 使用 std::ifstream 而不是文件缓存强制读取磁盘

opengl - 是否可以在 uint32 格式纹理上累积片段编号?

c++ - OpenGL:如何平滑地绘制三角形或多边形