OpenGL中使用glOrtho进行光照

3

我有一个3D对象,正在使用以下光源进行绘制:

    GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 0.9};  /* White light. */
GLfloat light_position[] = {300.0, 300.0, 300.0, 0.0};  
glShadeModel(GL_SMOOTH);
glEnable(GL_COLOR_MATERIAL);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);

当我在“正常”上下文中绘制对象时(即没有glOrtho),我希望对象能够被照亮。

然而,我正在处理对象的正交投影,并为此使用glOrtho(在ModelView矩阵上)。我在glOrtho调用之后初始化光源,然后以与3D情况相同的方式绘制对象。但由于某种原因,在进行glOrtho调用后,光照不起作用,也就是说,在正交投影上无法起作用。

这不是法线的问题,因为在3D情况下它可以工作。我猜测,由于glOrtho调用,所有东西都被压缩到一个薄层上,这就解释了为什么光线不像预期那样运行...但老实说,我对照明没有经验,所以可能是错误的。

有人知道发生了什么吗?

1个回答

1

光照发生在眼睛空间中,即在投影应用之前。您可能错误地使用了变换矩阵。glOrtho、glFrustung或gluPerspective进入GL_PROJECTION矩阵,gluLookAt和其他相机放置内容进入GL_MODELVIEW。


好的,你说得对,我可能确实使用它们的方式不正确。但是,那么,你如何解释我上面描述的情况,使用gluCylinder或glutSolidCube这样的对象完美地工作,即我不逐个创建自己的对象?我真的很好奇... - seb
1
@seb:这明显表明你没有提供法线。 - datenwolf
是的,我也这么认为,但我确实提供了它们,只是可能方式不对。您知道通过gluCylinder生成法线并将其与我的法线进行比较的任何方法吗? - seb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接