Unity自定义Shader点积判断逻辑异常困惑求助
问题解析:Shader中点积判断逻辑反转的原因
先直接拆解核心问题——你搞反了i.DirectionToSurface的实际方向,导致点积的正负逻辑和你预想的完全相反:
明确两个向量的真实方向:
_ScreenNormal:作为影院屏幕的法线,你肯定是设置成指向场景内部(也就是屏幕投射光线的“前方”),这个向量是离开屏幕、朝向场景的。i.DirectionToSurface:这个变量的定义应该是从场景中的像素点指向屏幕表面的向量,方向是朝向屏幕的,和屏幕法线完全反向。
点积的几何意义对应:
点积的结果是两个向量夹角的余弦值:- 同向(夹角0°)点积=1,反向(夹角180°)点积=-1,夹角90°点积=0。
对你的场景来说: - 屏幕前方(场景侧)的像素:
DirectionToSurface(指向屏幕)和_ScreenNormal(指向场景)反向,夹角>90°,点积为负数。 - 屏幕后方的像素:
DirectionToSurface和_ScreenNormal同向,夹角<90°,点积为正数。
- 同向(夹角0°)点积=1,反向(夹角180°)点积=-1,夹角90°点积=0。
为什么预想和实际相反:
你原本以为dot() > _LightAngle会筛选屏幕前方的像素,但这个条件只会匹配点积为正的情况——也就是屏幕后方的像素,自然和预期相反。
而dot(...) < -_LightAngle是在筛选点积小于负数的情况:也就是两个向量夹角大于90°,且夹角的余弦值比-_LightAngle更小(对应夹角在你设定的光照范围内),正好命中屏幕前方的像素。验证小技巧:
可以在Shader里临时把dot(i.DirectionToSurface, normalize(_ScreenNormal))的结果输出成颜色,直观看到屏幕前后的点积正负差异,就能彻底搞清楚方向逻辑。
内容的提问来源于stack exchange,提问作者Luckey Duckey
相关产品推荐
相关产品推荐

