我的github
在着色器(Shader)编程里,dot 函数是一个相当关键的数学函数,主要用于计算两个向量的点积(也被称作标量积)。下面为你详细介绍它的定义、功能和常见的应用场景。

数学定义

对于两个向量 A 和 B,它们的点积是这样计算的: \(\mathbf{A} \cdot \mathbf{B} = |\mathbf{A}| \times |\mathbf{B}| \times \cos(\theta)\) 这里面,\(|\mathbf{A}|\) 和 \(|\mathbf{B}|\) 分别代表向量 A 和 B 的长度,\(\theta\) 则是这两个向量之间的夹角。

代码中的实现

在不同的着色器语言中,dot 函数的使用方式基本是一样的。下面以 GLSL(OpenGL Shading Language)为例:
// 计算两个向量的点积
float dotProduct = dot(vec3(1.0, 0.0, 0.0), vec3(0.5, 0.5, 0.0)); // 结果为 0.5

核心作用

  1. 判断向量方向关系
    • 若点积结果大于 0,说明两个向量的方向大致相同。
    • 若点积结果等于 0,表明两个向量相互垂直。
    • 若点积结果小于 0,则意味着两个向量的方向基本相反。
  2. 计算投影长度
    • 点积可以用来计算一个向量在另一个向量方向上的投影长度,公式为: \(\text{投影长度} = \mathbf{A} \cdot \frac{\mathbf{B}}{|\mathbf{B}|}\)

实际应用场景

  1. 光照计算
    • 在 Lambert 漫反射模型中,会用到 dot 函数来计算光线方向和表面法线的点积,以此确定光照强度:
    float diffuse = max(dot(normal, lightDir), 0.0);
  2. 视线效果处理
    • 计算表面法线和视线方向的点积,能够实现边缘光照效果,像轮廓光就是基于此实现的:
    float rim = 1.0 - dot(normalize(viewDir), normal);
  3. 反射计算辅助
    • 在计算反射向量时,点积可以辅助确定反射的方向:
    vec3 reflectDir = reflect(incidentDir, normal);
    // 这里 reflect 函数内部会使用 dot 计算

注意要点

  • 向量维度匹配:参与点积运算的两个向量必须具有相同的维度,比如都是二维向量、三维向量或者四维向量。
  • 向量归一化:在进行光照计算等操作时,为了保证计算结果的准确性,通常需要先将向量归一化,也就是让向量的长度变为 1。

理解 dot 函数是掌握着色器编程中光照、阴影、反射等效果实现的重要基础。
posted on 2025-06-27 15:12  XiaoNiuFeiTian  阅读(59)  评论(0)    收藏  举报