OpenGL 2D平台游戏中的手电筒效果

OpenGL 2D平台游戏中的手电筒效果,opengl,flashlight,Opengl,Flashlight,在2D平台游戏中,如何创建手电筒效果(如本视频中的0:41左右) 我正在使用OpenGL进行照明 PS:我已经看过几次这样的效果,但我真的不知道如何创造它们。我知道我可以用glEnable创建新光源,但它们总是以90°的角度呈圆形照射在我的舞台上,所以这与我所寻找的完全不同。你必须告诉OpenGL你想要聚光灯,以及你想要什么样的圆锥体。让我们假设一个典型的闪光灯覆盖大约30度角。为此,您将使用: glLightf(GL_LIGHTn, GL_SPOT_CUTOFF, 15.0f); [其中,G

在2D平台游戏中,如何创建手电筒效果(如本视频中的0:41左右)

我正在使用OpenGL进行照明


PS:我已经看过几次这样的效果,但我真的不知道如何创造它们。我知道我可以用glEnable创建新光源,但它们总是以90°的角度呈圆形照射在我的舞台上,所以这与我所寻找的完全不同。

你必须告诉OpenGL你想要聚光灯,以及你想要什么样的圆锥体。让我们假设一个典型的闪光灯覆盖大约30度角。为此,您将使用:

glLightf(GL_LIGHTn, GL_SPOT_CUTOFF, 15.0f);
[其中,
GL_LIGHTn
对于灯1是
GL_LIGHT1
,对于灯2是
GL_LIGHT2
,依此类推]

您还需要使用
glLightfv
GL\u LIGHT\u DIRECTION
来指定手电筒指向的方向。您可能还希望使用
GL\u SPOT\u EXPONENT
指定灯光在圆锥体边缘的衰减方式。哦,您可能还想使用
GL\u XXX\u衰减
s之一(但很多时候,这是不必要的)


如果您想支持投射阴影,这是另一个更复杂的主题(在这里的回答中可能太多了)。

您必须告诉OpenGL您想要聚光灯,以及您想要什么类型的圆锥体。让我们假设一个典型的闪光灯覆盖大约30度角。为此,您将使用:

glLightf(GL_LIGHTn, GL_SPOT_CUTOFF, 15.0f);
[其中,
GL_LIGHTn
对于灯1是
GL_LIGHT1
,对于灯2是
GL_LIGHT2
,依此类推]

您还需要使用
glLightfv
GL\u LIGHT\u DIRECTION
来指定手电筒指向的方向。您可能还希望使用
GL\u SPOT\u EXPONENT
指定灯光在圆锥体边缘的衰减方式。哦,您可能还想使用
GL\u XXX\u衰减
s之一(但很多时候,这是不必要的)


如果您想支持阴影投射,这是另一个更复杂的主题(在这里的回答中可能太多了)。

您为哪个平台(如硬件/操作系统)开发?就像前面提到的一样,听起来您使用的是固定函数OpenGL,这在今天被认为是“不推荐的”。您可能希望了解OpenGL 3.2,并使用完全基于着色器的方法。这意味着自己处理所有光源。这也将允许您创建实时阴影和其他漂亮的效果

您开发什么平台(如硬件/操作系统)?就像前面提到的一样,听起来您使用的是固定函数OpenGL,这在今天被认为是“不推荐的”。您可能希望了解OpenGL 3.2,并使用完全基于着色器的方法。这意味着自己处理所有光源。这也将允许您创建实时阴影和其他漂亮的效果

请注意,固定功能OpenGL照明是逐顶点的,即不会在原语的每个片段上进行计算。因此,要使聚光灯效果发挥作用,几何体必须充分细分,即聚光灯圆锥体必须覆盖相当多的顶点才能获得有效的聚光灯效果。如果你不想细分,在片段着色器中实现聚光灯,使其成为每个片段。请提供一个包含2D合理值的最小示例。请注意,固定功能OpenGL照明是逐顶点的,即不会在原语的每个片段上进行计算。因此,要使聚光灯效果发挥作用,几何体必须充分细分,即聚光灯圆锥体必须覆盖相当多的顶点才能获得有效的聚光灯效果。如果你不想细分,在片段着色器中实现聚光灯,使其成为每个片段。您能提供一个包含2D合理值的最小示例吗?