【问题标题】:OpenGL lighting appears on the opposite sideOpenGL 光照出现在对面
【发布时间】:2011-05-04 20:21:29
【问题描述】:

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

【问题讨论】:

  • 您是否检查过着色器以确保它们适合右手坐标系?这可能只是反转z轴的问题。编辑:另外,听起来您将法线乘以模型视图矩阵,您可能需要研究一下。
  • 我不使用自定义着色器,我们必须使用标准管道。我的法线通过 glNormal3f 提供给 OpenGL,因此是的,我相信它们乘以模型视图矩阵,但不是直接乘以我。我无法理解的是,将法线与 -1 相乘怎么会弄乱整个照明?

标签: opengl light


【解决方案1】:

对我来说,这听起来像是糟糕的法线——请记住,除了符号错误之外,还有很多方法可以破坏法线向量:

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

祝你好运!

【讨论】:

  • 嗯,不知何故 GL_NORMALIZE 解决了它,但现在我真的对 OpenGL 感到困惑。我绝对确定我的法线在将它们乘以 -1 之前和之后都有并且有单位长度,我的代码对此充满了断言。现在这很好(顺便说一句,他们接受了我的作业,对面有灯光),但下一阶段是根据这个场景创建一个第一人称击剑游戏,所以我真的很想弄清楚真实的造成这种现象的原因,至少让我自己冷静一下。 GL_NORMALIZE 除了向量归一化还有什么作用吗?
【解决方案2】:

很遗憾,您链接到的 zip 没有代码...

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

glLightModel(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE)

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

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

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 2015-01-31
    • 2020-07-24
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2011-08-11
    相关资源
    最近更新 更多