OpenGL照明出现在另一侧

时间:2011-05-04 20:21:29

标签: opengl light

我对OpenGL有一个非常令人不安的问题。

我的作业是创造一个人,一把剑和其他物体的场景,点亮灯是每个人的“手掌”(右边是绿色,左边是红色),并且有定向光源像太阳一样。

这是一个包含我的程序的两个版本的zip:http://www.woofiles.com/dl-245221-OdPUtOaW-Release.zip

(不幸的是,这些名字是匈牙利人,“szép_de_rossz_oldalon_a_fény”的意思是“不错但灯光在对面”,而“fény_jó_oldalon_de_ronda”的意思是“右侧的灯光却很丑”。)

我的问题是灯光的效果出现在我的细分参数曲面的另一侧。

逻辑解释是表面法线不正确,但将它们乘以-1会产生更奇怪的结果。正常的矢量插值似乎被打破了,剩下的是粗糙的表面,光线不好。所有那些通过扭转法线。 我确信三角形朝向正确的方向,矢量运算完美无瑕,并且所有内容都应该在场景中显示(可以看出剑是绿色的,但是其他表面的那一侧是红色)。

2 个答案:

答案 0 :(得分:3)

对我来说听起来很糟糕 - 请记住,除了签名错误之外,还有很多方法可以搞乱法线向量:

  • 您的法线可能没有单位长度(您可以通过尝试glEnable(GL_NORMALIZE)并查看它是否有所不同来验证。)
  • 它们可能不是真正的表面(通过比较三角形边缘与正常向量的交叉积来检查)
  • 你的三角形顶点可能有不一致的包裹(CW / CCW),有效地翻转法线的符号(除非启用了剔除 - 然后你可能根本看不到一些三角形)
祝你好运!

答案 1 :(得分:2)

不幸的是,您链接到的zip没有代码......

在我将多边形面板混淆之前尝试使用的一件事就是使用GL_LIGHT_MODEL_TWO_SIDE作为glLightModel,这会导致多边形的两边都被点亮而不仅仅是正面。 从记忆中看,用法是

glLightModel(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE)

(或者说是什么) 在任何照明发生之前拨打电话。

这是一个hacky解决方案,但我看不到代码,我猜你已经到了最后期限..至少要有人尝试更好的解决方案:)