将GLSL翻译为C++ float/vec3?

Joh*_* Du 8 c++ glsl

这条线究竟做了什么

ra.rgb * ra.w / max(ra.r, 1e-4) * (bR.r / bR);
Run Code Online (Sandbox Code Playgroud)

我很困惑的部分是如何翻译

(bR.r / bR);
Run Code Online (Sandbox Code Playgroud)

一个浮点除以vec3?我想将它转换为C++,但是返回一个浮点除以向量的所有元素是什么?等等

(无法访问显卡进行检查?)

And*_*man 4

这是按组件划分的示例,其工作原理如下:

\n\n

GLSL 4.40 规范- 5.9 表达式 - 第 101-102 页

\n\n
\n

如果操作数中的基本类型不匹配,则应用第 4.1.10节 \xe2\x80\x9cImplicit Conversions\xe2\x80\x9d中的转换来创建匹配类型。[...]转换后,以下情况有效:

\n\n
\n

[...]

\n\n
    \n
  • 一个操作数是标量,另一个操作数是向量或矩阵。在这种情况下,标量运算独立地应用于向量或矩阵的每个分量,从而产生相同大小的向量或矩阵。
  • \n
\n
\n
\n\n

给出表达式:

\n\n
        vv vec3\n(bR.r / bR);\n    ^ float\n
Run Code Online (Sandbox Code Playgroud)\n\n

标量bR.r本质上被提升为vec3 (bR.r, bR.r, bR.r),然后执行分量除法,得到vec3 (bR.r/bR.r, bR.r/bR.g, bR.r/bR.b)

\n\n

因此,这个表达式等价于:

\n\n
vec3 (1.0, bR.r/bR.g, bR.r/bR.b)\n
Run Code Online (Sandbox Code Playgroud)\n