矢量如何在着色器语言中成倍增加?

Fra*_*eng 22 opengl

比如gl_FragColor = v1 * v2,我真的无法得到它是如何相乘的,似乎参考给出了向量乘法矩阵的解释.
PS:该类型的v1v2都是vec4.

Mat*_*ias 39

*运营商工作的逐分量像载体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)
Run Code Online (Sandbox Code Playgroud)

GLSL语言规范第说5.10向量和矩阵操作:

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

  • @ user674199:不,标量(=点)产品的结果是标量.向量上的`*`GLSL运算符的结果再次是向量.您可以通过在分量乘法后添加矢量分量来制作标量乘积.但如果你真的需要一个标量产品,GLSL提供了内置函数`dot`. (11认同)
  • 这是一个 [ShaderToy 程序](https://www.shadertoy.com/view/Xs23zV),它说明了乘法确实是按组件进行的。 (2认同)
  • @FrankCheng在GLSL中,执行`vec4 c = a*b;`与执行`vec4 c相同; cx = ax*bx; cy = ay*by; cz = az*bz; cw = aw*bw;`.这就是组件意味着 - 向量的每个组件都被视为代数值,忽略了其他组件.如果考虑硅片上发生的事情,可能更容易合理化 - vec4*vec4乘法不是数学或几何矢量; 它只是4个浮点值,它们独立地乘以4个其他浮点值,并行计算. (2认同)
  • @FrankCheng 因此,进行极端着色器优化的人们有时会将不相关的数据集中到“vec4”中,这样​​他们就可以在进行代数运算时获得并行化加速。__TL;DR:对于 GLSL 和 GPU 来说,“vec4”并不意味着任何特定的数学/几何意义;它只是内存中一个接一个的 4 个浮点数。__ _(在向量具有内在数学含义的编程环境中,您会看到诸如“point3”、“normal3”、“offset3”、“velocity3”、“accel3”之类的类型, ETC。)_ (2认同)