【问题标题】:Simplest 2D Lighting in GLSLGLSL 中最简单的 2D 光照
【发布时间】:2020-04-14 15:24:59
【问题描述】:

你好,我想在 GLSL 中实现一个简单的 2D 光照技术。我的投影矩阵设置为使窗口的左上角为 (0, 0),右下角为 (window.width, window.height)。我在片段着色器uniform vec2 lightPosition; 中有一个统一变量,当前设置为鼠标位置(同样,在同一坐标系中)。我还计算了从光到像素的距离。


我想根据像素与光源的距离来点亮它。但这里有一个问题,我不想让它比原来的颜色更亮。例如,如果像素的颜色是 (1, 0, 0 (red)),无论光线离它多近,它都不会改变更多,这增加了 令人讨厌的高光度 em>。光源离像素越远,我希望它变得越暗。 我真的觉得我已经快要得到我想要的了,但我就是得不到!


非常感谢您的帮助。我觉得这是一个实现起来相当简单的代码(我为不知道而感到羞耻)。

【问题讨论】:

  • 你还没有真正描述你在做什么,但是将光应用到某些材质颜色的标准方法是通过每通道相乘,光值在 [0,1] 或当然.
  • @derhass 我认为它足够清楚。 (s)他想限制基于片段和光源的原始距离的光照强度......但是示例片段代码不会伤害分享

标签: opengl glsl


【解决方案1】:

为什么不将距离扩大到<0..1> 范围,方法是将其除以某个最大可见距离vd 使其最大化,所以:

d = min( length(fragment_pos-light_pos) , vd ) / vd;

这应该让您获得<0..1> 片段到光的距离范围。现在,您可以根据需要选择执行简单的非线性化(使用不会更改范围的pow...)

d = pow(d,0.5);

d = pow(d,2.0);

取决于你认为更好看的东西(你可以玩指数...),最后计算颜色:

col = face_color * ((1.0-d)*0.8 + 0.2);

其中0.8 是您的光源强度,0.2 是环境光。

【讨论】:

  • 嗯。似乎是一个不错的解决方案。我想我尝试了类似于将距离限制为 (0-1) 的方法,使用 normalize(fragPos - lightPos),但我不知道为什么它不起作用。
  • @ReluctantProgrammer 因为那个只会给你方向向量并且总是扔掉距离信息......那个叫做per pixel normal shading然后颜色是col = face_color * ( 0.8 * dot (normalize(fragPos - lightPos) , normalize(face_normal))) + 0.2;就像在这里:@987654321 @ 但是这个公式将与片段和光距离无关,因为归一化将始终返回大小为 ~1.0 的向量(输入为零或发生 FP 舍入时的边缘情况除外)
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多