【问题标题】:Lighting inside of a sphere?在球体内照明?
【发布时间】:2011-03-28 08:15:47
【问题描述】:

我有一个问题:我需要制作一个看起来像真实天空的场景。我的第一个想法是制作一个立方体并对其进行纹理化。没那么好看。我想出了使用球体的想法。但我不能从里面点燃它。我已经把相机放在原点观看(0,0,-100)。环境和镜面光源也在原点。看不到任何东西亮着!制作天空的方法有哪些?如何照亮球体的内部?

【问题讨论】:

  • 你是如何创建球体的?

标签: opengl geometry glut lighting pixel-shading


【解决方案1】:

尝试更改剔除模式,因为您位于球体内部。

我是 XNA 人,但看起来这将是 OpenGL equivalent。如果您按照您所说的那样打开环境照明,我相信您应该能够看到一些东西,而不管法线如何。

【讨论】:

    【解决方案2】:

    试试flipping the normals of the sphere(更多搜索结果here)。一般来说,渲染引擎使用算法来确定什么是看不到的,因此不应该渲染;一种这样的技术是backface culling. 我猜球体是以法线从球体中突出,远离中心的典型方式创建的;你需要你的法线朝向相反的方向。

    【讨论】:

    • 我使用 glutSolidSphere。法线是正确的,而改变法线是棘手的和错误的,因为它有一些意想不到的结果!
    【解决方案3】:

    如果从外面看是亮的,但从里面看是暗的,那么可能是球体的法线指向错误的方向。

    假设您正在使用 phong/gouraud 照明,法线和视图方向之间的余弦将在某处计算。余弦为负数,您的显卡将钳位为零,从而产生黑色。

    所以,如果你的法线是明确指定的,你应该尝试反转它们的方向 -> 乘以 -1。如果您只有顶点和面,您可能需要更改面中的顶点顺序。只需切换两个索引。 (1-2-3) -> (1-3-2)。这会将顺序从顺时针更改为逆时针(或反向)。要测试您的结果,您可以打开和关闭背面剔除,看看会发生什么。

    【讨论】:

      【解决方案4】:

      问题解决了。谢谢,但法线不是答案。我使用 glutSolidSphere,所以法线没有错。尝试使用 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);那应该为你做这项工作。

      【讨论】:

      • 其实是一样的。您只是忽略了法线指向相反的方向。
      • 你应该接受 bporter 的回答,因为你做了他的建议,或者 I82Much 的,因为这是相当的
      【解决方案5】:

      当我制作天空穹顶、天空盒子或天空飞机时,我实际上并没有点亮它。我只是在上面放了一个纹理并渲染它。

      glDisable(GL_LIGHTING);
      glDisable(GL_CULL_FACE);
      Render sky dome
      glEnable(GL_LIGHTING);
      glEnable(GL_CULL_FACE);
      

      但是,这样做的问题是更改状态可能代价高昂。因此,消除 GL_CULL_FACE 状态更改的一种方法是确保您的法线指向正确的方向。如果 CULL_FACE 设置为 CCW(逆时针),那么法线应该指向您。但是,如果 CULL_FACE 设置为 CW (ClockWise),那么法线应该指向远离您的方向。我能看到消除 GL_LIGHTING 状态变化的唯一方法是使用着色器并定义自己的照明方案。但是,我不知道那是更贵还是更便宜。

      天空盒问题是一个类似的故事,但它还有其他问题。如果您的视点不在中心,您可能会遇到失真问题。我通常做的是先渲染天空盒,以相机为中心,然后清除深度缓冲区并渲染其他所有内容。这样你的天空盒就不必太大了。

      【讨论】:

        猜你喜欢
        • 2016-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 2019-07-27
        • 1970-01-01
        相关资源
        最近更新 更多