【问题标题】:How does vectors multiply act in shader language?向量乘法如何在着色器语言中起作用?
【发布时间】:2012-12-16 12:05:48
【问题描述】:

gl_FragColor = v1 * v2,我真的不知道它是如何相乘的,似乎参考文献给出了向量乘法矩阵的解释。
ps:v1v2的类型都是vec4

【问题讨论】:

  • @H2CO3 实际执行的操作甚至没有在此处列出。
  • @KillianDS 是的。标量(点)积。
  • 就是点积的定义。问题是关于 * 运算符对 GLSL 中向量的影响。答案是 * 表示组件明智的乘法

标签: opengl


【解决方案1】:

* 运算符适用于component-wise,用于vec4 等向量。

vec4 a = vec4(1.0, 2.0, 3.0, 4.0);
vec4 b = vec4(0.1, 0.2, 0.3, 0.4);
vec4 c = a * b; // vec4(0.1, 0.4, 0.9, 1.6)

GLSL Language Specification5.10 向量和矩阵运算部分下说

除了少数例外,操作是按组件进行的。通常,当一个 运算符对向量或矩阵进行操作,它是独立操作的 在向量或矩阵的每个分量上,按分量 时尚。 [...] 例外是矩阵乘以向量,向量 乘以矩阵,矩阵乘以矩阵。这些不 以组件方式操作,而是执行正确的线性 代数乘法。

【讨论】:

  • 所以它只是做点积?
  • @user674199:不,标量 (=dot) 乘积的结果是标量。 * GLSL 运算符对向量的结果又是一个向量。您可以通过在分量乘法之后添加向量分量来制作标量积。但是如果你真的需要一个标量产品,GLSL 提供了内置函数dot
  • 这是一个ShaderToy program,它说明乘法确实是按分量计算的。
  • @FrankCheng 在 GLSL 中,vec4 c = a * b;vec4 c; c.x = a.x * b.x; c.y = a.y * b.y; c.z = a.z * b.z; c.w = a.w * b.w; 相同。这就是分量的含义——向量的每个分量都被视为一个代数值,忽略其他分量。如果考虑硅上发生的事情,可能更容易合理化——vec4 * vec4 乘法不是数学或几何向量;它只是 4 个浮点值,它们独立地乘以 4 个其他浮点值,并行计算。
  • @FrankCheng 因此,进行极端着色器优化的人有时会将不相关的数据集中到vec4s 中,这样他们就可以在进行代数运算时获得并行化加速。 TL;DR:对于 GLSL 和 GPU,vec4 在数学/几何上并不意味着任何特定的东西;它在内存中只有 4 个浮点数一个接一个。 (在向量具有内在数学意义的编程环境中,您会看到像 point3normal3offset3velocity3 这样的类型、accel3 等)
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多