Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL灯光限制_Opengl_Lighting - Fatal编程技术网

OpenGL灯光限制

OpenGL灯光限制,opengl,lighting,Opengl,Lighting,当我阅读红皮书时,我一直很困惑,openGL在场景中最多可以有8个灯光(数量取决于实现,但应该在8左右) 但我可以想象很多情况下需要更多的灯光,所以我认为在游戏开发中有一个技巧 例如,你有一条有50盏路灯的很长的街道,或者你可以让20个人组成一个小组,都使用手电筒。你实际上是如何模拟这些情况的?有一个问题,光线只照亮网格的一部分,而不是光源和对象之间的整个圆锥体,所以如果我们没有100%清洁的空气,也必须进行某种模拟。这是怎么做的,游戏运行顺利吗?(我还读到,启用所有8个灯光可能会杀死FPS)游

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

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


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

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

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

也有类似的方法,将半透明纹理或带有透明圆锥体的纹理覆盖在场景上,以提供相同的效果


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

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


更新:带有分支的复杂着色器甚至可以生成灯光(想想长街或圣诞树)。在计算机图形学中,照明是一个非常复杂的课题

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

OpenGL照明实现是动态灯光,这是一种光点抽象,允许对渲染顶点(用于渲染三角形)进行“照明”(即,赋予颜色)。。。顶点被照亮,获取每个灯光的颜色贡献

正如您所提到的,渲染过程需要更多的时间—我们启用的灯光越多。为了最小化这一点,您有不同的可能性

  • 灯光消隐(排除对颜色影响不大的灯光),这是使用灯光特性(距离、圆锥体、衰减、视点和障碍物)确定的
  • 静态照明,它使用纹理在从不移动的对象上模拟照明
OpenGL固定照明有助于顶点颜色,该颜色与其他顶点颜色一起插值,以便栅格化三角形。如果几何体由几个三角形组成,则无法在每个三角形内看到任何光锥,因为其片段的颜色是三种颜色(三个顶点)插值的结果

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


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

更新:这项技术讨论了很多,这里有一个链接:弱灯光不是着色器功能,由于启用/禁用灯光的功能可以在设计灯光管理器的固定管道之外完成,因此只启用重要灯光。灯光管理器为整个场景启用/禁用灯光。像素着色器可以按像素执行,看到区别了吗?顺便说一句,传统管道中的8个灯光是逐顶点的,而着色器是逐像素照明的-这是完全不同的。我看到了区别,但从你的回答来看,着色器似乎可以做到所有这些(按像素),但顶点照明的外观很好,在当前世界中仍然有效,即使使用着色器。一旦你比较逐顶点和逐像素着色,你很难回到前一个。。。考虑凹凸贴图、视差贴图、反射和其他效果。