首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >聚光灯似乎总是指向世界的中心

聚光灯似乎总是指向世界的中心
EN

Stack Overflow用户
提问于 2016-05-02 01:52:52
回答 1查看 64关注 0票数 1

我目前面临的问题是,我的聚光灯似乎总是面对我的世界的中心,即使我仔细检查了我传递给着色器的方向向量。

具有相同代码的点光源(但不会根据其允许的角度和方向限制光源)工作正常。所以我的光矢量和所有东西似乎都起作用了。

下面是这种行为的一张图片:

在图片上,灯光朝向世界的中心,而不是无人机面对的右侧。蓝色的点灯是为了证明照明在其他方面似乎是有效的。

我正在计算视图空间中的灯光,并将以下内容传递给着色器:

代码语言:javascript
运行
复制
SpotLightPositionViewSpace[spotLightNum] = Vector3.Transform(l.getPosition(), viewMatrix);
…
SpotLightDirectionViewSpace[spotLightNum] = Vector3.Normalize(Vector3.Transform(l.getLightDirection(), viewMatrix));
SpotLightAngleCos[spotLightNum] = (float)Math.Cos((double)(l.getLightAngleRad() / 2f));

在着色器中,如果光方向和光向量之间的点积大于光的最大允许角度的余弦,我不会照亮像素(这样做会更流畅):

代码语言:javascript
运行
复制
lightDirection = normalize(SpotLightPositionViewSpace[j] - pin.PositionViewSpace.xyz);

if (intensityBasedOnDistance > 0.0 
&& (intensity = max(dot(surfaceNormal, lightDirection), 0.0)) > 0.0 
&& dot(-lightDirection, SpotLightDirectionViewSpace[j]) > SpotLightAngleCos[j])
{
diffuseColor += float4(SpotLightColor[j] * intensity * intensityBasedOnDistance * SpotLightIntensity[j], 0.0);
}
EN

回答 1

Stack Overflow用户

发布于 2016-05-02 09:47:15

在尝试了几个小时之后

代码语言:javascript
运行
复制
SpotLightDirectionViewSpace[spotLightNum] = Vector3.Normalize(Vector3.Transform(l.getLightDirection(), viewMatrix));

代码语言:javascript
运行
复制
SpotLightDirectionViewSpace[spotLightNum] = Vector3.Normalize(Vector3.Transform(l.getForward(), viewMatrix.Rotation));

解决了..。不知道为什么,但它现在起作用了。

如果有人能解释这一点,我将不胜感激。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36969934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档