【问题标题】:OpenGL lights limitOpenGL 灯光限制
【发布时间】:2011-04-04 18:24:16
【问题描述】:

当我阅读红皮书时,我一直很困惑,openGL 在场景中最多可以有 8 个灯光(数量取决于实现,但应该是 8 个左右)。

但我可以想象需要更多灯光的情况有很多,所以我认为游戏开发中有一个技巧。

例如,您的街道很长,有 50 个手电筒,或者您可以让 20 人的小队都使用手电筒。您如何实际模拟这些情况?有一个问题,光只照亮网格的一部分,而不是光源和物体之间的整个锥体,所以如果我们没有 100% 清洁的空气,也必须有某种模拟。这是怎么做的,游戏运行流畅?(我还读到启用所有8个灯可能会杀死FPS)

【问题讨论】:

    标签: opengl lighting


    【解决方案1】:

    将在游戏中使用的技巧之一是使用纹理模拟灯光。

    因此,在您的路灯示例中,“照明”区域实际上是更亮的纹理图像。只有最近的灯才会成为获得正确效果的光源。

    有类似的方法,将半透明纹理或具有透明锥体的纹理覆盖在场景中以产生相同的效果。

    不要忘记实时计算阴影等意味着必须从灯光的角度渲染场景以计算任何给定位置的灯光强度。因此,对于 8 盏灯,您要在实际渲染场景以供显示之前将场景(或场景的一部分)渲染多达 8 次。即使这是在 GPU 而不是 CPU 上完成的,它也非常昂贵。

    【讨论】:

      【解决方案2】:

      8 个灯是固定 GL 管道的限制,您可以在其中启用每个灯、设置模式、参数等。现在您有了像素着色器,并且照明在着色器中完成。在那里,您可以使用大量 动态(未烘焙到纹理中)灯光。您只需要充分提供所有这些灯光的参数(也许在纹理中),并测试您的着色器能够处理多少灯光。此外,在着色器中,您可以剔除太弱的光线(对像素值的贡献太小)或太远的光线。

      更新:带有分支的复杂着色器甚至可以生成灯光(想想长街或圣诞树)。它可能比提供大量参数更有效。

      【讨论】:

      • 更新:这个技术被讨论了很多,这里有一个链接:opengl.org/discussion_boards/…
      • 弱光不是着色器功能,因为启用/禁用光的能力可以在设计光管理器的固定管道之外完成,仅启用重要的光。
      • 灯光管理器启用/禁用整个场景的灯光。像素着色器可以按像素完成,看到区别了吗?顺便说一下,传统管道中的 8 个光照是逐顶点的,而着色器是逐像素光照的——完全不同。
      • 我看到了区别,但从您的回答看来,着色器可以完成所有工作(按像素),但顶点光照看起来不错,并且在当前世界中仍然有效,即使使用着色器也是如此。跨度>
      • 一旦比较了逐顶点和逐像素着色,就很难再回到前一种了……想想凹凸贴图、视差贴图、反射和其他效果。
      【解决方案3】:

      照明是计算机图形学中一个非常复杂的主题。

      当然,真正重要的是对象照明,模拟真实世界的照明或我们的目标效果。照明环境可以由许多来源组成,以接近我们想要达到的真实效果。

      OpenGL 光照实现是动态光照,它是光点抽象,允许“光照”(即,赋予颜色)到渲染顶点(用于渲染三角形)。 ...顶点被照亮,获取每个光的颜色贡献。

      正如您所提到的,渲染过程需要更多时间,我们启用了更多灯光。为了尽量减少这种情况,您有不同的可能性。

      • 灯光剔除(排除对改变颜色贡献很小的灯光),这是使用灯光属性(距离、锥体、衰减、视角和障碍物)确定的。
      • 静态光照,它使用纹理模拟从不移动的对象上的光照。

      OpenGL 固定照明有助于顶点颜色,它与其他顶点颜色进行插值以栅格化三角形。在几何体由几个三角形组成的情况下,每个三角形内部都看不到任何光锥,因为它的片段颜色是三种颜色(三个顶点)插值的结果。

      为了实现更精确的光照,软件将确定每个片段(像素)的颜色(像素光照),就像顶点被光照着色一样,但正如您所理解的,像素可能比顶点多。 一种方法是在光栅化阶段计算(使用着色器或 OpenGL 扩展)光对几何体每个像素的贡献,或使用延迟光照确定像素颜色。

      延迟光照使用多个纹理(对应于视口)来存储每个显示像素的光照参数。这样,您可以在生成图像后执行光照计算,为每个像素确定一次像素光照贡献,而不是为每个几何像素确定一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        相关资源
        最近更新 更多