兰伯特模型漫反射公式中的光线向量是光照射的反方向,为什么在用shader实现的时候用的却是光照射的正方向的向量
时间: 2024-09-09 15:08:25 浏览: 30
UnityShader 漫反射(兰伯特与半兰伯特光照模型-逐顶点和逐像素光照)
在渲染器的着色器实现中,尽管理论上计算漫反射时应该使用光照射的反方向(光源到表面的向量),但实际上使用的往往是光的方向向量(光源到观察者的位置向量)。这是因为计算过程中通常涉及的是从表面发出的光线到达眼睛的路径,即从表面反射出去的光线。因此,在光照模型中,我们想要模拟的是最终观众看到的反射效果。
在兰伯特模型中,`diffuse = 直射光颜色 * max(0, cos(光方向·法线方向))`,这里的"光方向"指的是光源投射到表面的正向向量,而不是反向。当计算反射强度时,cosθ通常取正值,因为正向的余弦值总是非负的,这样可以简化公式并直接表示入射光与表面法线之间的夹角,而不用关心反射方向的具体计算。
如果要实现这个公式,通常在着色器代码中会是这样的:
```glsl
float diffuseReflection = dot(normal, lightDirection);
diffuseColor *= max(0.0, diffuseReflection);
```
在这里,`lightDirection`通常是正向的,因为它代表从光源到表面的光线方向。注意,实际应用中可能还需要考虑一些额外因素,比如阴影和环境遮挡,但基本原理就是这样。
阅读全文