1

我对 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 会得到一个更奇怪的结果。法线向量插值似乎被破坏了,剩下的是一个光线不好的粗糙表面。所有这一切都是通过颠倒常态来实现的。我确信三角形朝向正确的方向,矢量算术完美无缺,并且一切都放置在它应该在的场景中(可以看到剑是绿色的,但其他表面的那一侧是红色的)。

4

2 回答 2

3

对我来说听起来像是不好的法线——请记住,除了符号错误之外,还有很多方法可以搞砸法线向量:

  • 您的法线可能没有单位长度(您可以通过尝试glEnable(GL_NORMALIZE)并查看它是否有所作为来验证)。
  • 它们可能并不真正与表面垂直(通过将三角形边的叉积与法线向量进行比较来检查)
  • 您的三角形顶点可能有不一致的环绕 (CW/CCW),有效地翻转了法线的符号(除非启用了剔除 - 那么您可能根本看不到一些三角形)

祝你好运!

于 2011-05-04T22:55:07.820 回答
2

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

当我把我的多边形面混合起来时,我之前不得不使用的一个尝试的事情是使用 GL_LIGHT_MODEL_TWO_SIDE 作为 glLightModel,这会导致多边形的两侧都被照亮,而不仅仅是正面。从记忆中使用是

glLightModel(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE)

(或类似的东西)在任何照明发生之前拨打电话。

这是一个 hacky 解决方案,但我看不到代码,我猜你在最后期限内.. 至少在有人提出更好的解决方案之前尝试一些东西 :)

于 2011-05-04T20:52:09.953 回答