美文网首页OpenGL学习笔记
【五十,投光物-03聚光-手电筒光效】

【五十,投光物-03聚光-手电筒光效】

作者: Woodlouse | 来源:发表于2019-12-20 19:32 被阅读0次

聚光

  • 位于场景中某一处;
  • 只朝某个方向照射;
  • 只有照射方向确定半径范围内的物体被照亮;

例子:路灯,手电筒。

工作示意图

light_casters_spotlight_angles.png
  • LightDir:从片段指向光源的向量。
  • SpotDir:聚光所指向的方向。
  • Phiϕ:定义聚光半径的切光角。每个落在这个角度之外的,聚光都不会照亮。
  • Thetaθ:LightDir向量和SpotDir向量之间的角度。θ值应该比Φ值小,这样才会在聚光内。

手电筒

手电筒(Flashlight)是一个在观察者位置的聚光,通常瞄准玩家透视图的前面。一个手电筒是一个普通的聚光,根据玩家的位置和方向持续的更新它的位置和方向。
我们需要为着色器提供:

  • 位置向量
  • 聚光方向向量
  • 聚光切角
struct Light
{
    vec3 position;
    vec3 direction;
    float cutOff;
    ...
};

在代码中设置相关值:

glUniform3f(lightPosLoc, camera.Position.x, camera.Position.y, camera.Position.z);
glUniform3f(lightSpotdirLoc, camera.Front.x, camera.Front.y, camera.Front.z);
glUniform1f(lightSpotCutOffLoc, glm::cos(glm::radians(12.5f)));

我们给片段着色器传递的是余弦值:这么做的原因是在片段着色器中,我们计算LightDir和SpotDir向量的点乘,而点乘返回一个余弦值,不是一个角度,所以我们不能直接把一个角度和余弦值对比。为了获得这个角度,我们必须计算点乘结果的反余弦,这个操作开销是很大的。所以为了节约一些性能,我们先计算给定切光角的余弦值,然后把结果传递给片段着色器。由于每个角度都被表示为余弦了,我们可以直接对比它们,而不用进行任何开销高昂的操作。

运行效果

手电筒运行效果

手电筒光效代码

相关文章

  • 【五十,投光物-03聚光-手电筒光效】

    聚光 位于场景中某一处; 只朝某个方向照射; 只有照射方向确定半径范围内的物体被照亮; 例子:路灯,手电筒。 工作...

  • 投光物

    一个光源把光投射到物体上,叫做投光(Light casters)。 定向光 当一个光源很远的时候,来自光源的每条光...

  • 《夏末爱未歇》04 人生若只如初见(四)

    夏墨被刺眼的手电筒光照得睁不开眼。 看不清对面来人是男是女。 车速也变慢了。 还没等她反应过来,陌生人突然关掉手电...

  • LearnOpenGL 投光物

    定向光 当一个光源很远的时候,来自光源的每条光线接近于平行。这看起来就像所有的光线来自于同一个方向,无论物体和观察...

  • 手电筒朝天照射一秒再关掉,是继续传播还是消失?

    只要打开手电筒朝着天空照射,不管是一秒,还是一毫秒,或者是更短的时间,手电筒所发出的光将会继续传播。除非光与其他物...

  • 你好 冼村

    这个 巷子被伪装门隔断 被分离了两边的村庄 有陌生男人女人的注视目光 有略显刺眼的保安的手电筒光 残垣 断壁 阴冷...

  • 麦田格首届三行诗大赛专家评审奖获奖作品

    特别增设专家评审奖作品展示 【特 别 金 奖】 一个少年孤独地站在月亮上拿着手电筒光照着他的故乡——《月光》 张馨...

  • 老去之后的夏日

    6岁夏天小河沟的龙虾,依然咬在手指上倔强的不松开 10岁夏天晚饭后,伏在手电筒光下的蝉,隐形到了现在 13岁夏天,...

  • 走在凌晨的雨里

    凌晨,雷雨交加,我突然觉得雷和闪电其实并不那么可怕了。看了看熟睡的孩子们,我悄悄地锁好门,微亮的手电筒光看...

  • 灯光

    点光源 聚光灯 环境光(漫反射) 平行光

网友评论

    本文标题:【五十,投光物-03聚光-手电筒光效】

    本文链接:https://www.haomeiwen.com/subject/cxxbnctx.html