GLSL 中 normalize() 和 length() 的底层实现
Underlying implementation of normalize() and length() in GLSL
GLSL 中 normalize() 和 length() 的底层实现是什么?我正在尝试评估我的代码的性能,以及如何知道 GLSL 中的某些内置函数正在执行哪些指令。我在哪里可以获得有关其他内置函数的底层实现的更多信息?
答案非常GPU/vendor依赖;但它可能会给你一个线索,让你看看 AMD Shader Analyser 提供的输出,或者看看 'binary' NVidia 上已编译着色器的转储 - 我上次检查时(很久以前),它们包含程序集文本形式的代码。
OpenGL 着色语言规范通常不要求其功能的特定实现,只要它们提供指定的结果即可。例如,在 GLSL 4.5 中,请参阅第 84 页的正确性要求,以及第 150 页的函数 length()
和 normalize()
。
此外,GLSL 没有为已编译的着色器代码定义二进制格式;该格式相应地依赖于实现。
但是,一般来说,我假设 length
函数将使用点积和平方根来实现,而 normalize
函数将通过调用 length
函数,还做三除法,或一除法和向量乘法。
GLSL 中 normalize() 和 length() 的底层实现是什么?我正在尝试评估我的代码的性能,以及如何知道 GLSL 中的某些内置函数正在执行哪些指令。我在哪里可以获得有关其他内置函数的底层实现的更多信息?
答案非常GPU/vendor依赖;但它可能会给你一个线索,让你看看 AMD Shader Analyser 提供的输出,或者看看 'binary' NVidia 上已编译着色器的转储 - 我上次检查时(很久以前),它们包含程序集文本形式的代码。
OpenGL 着色语言规范通常不要求其功能的特定实现,只要它们提供指定的结果即可。例如,在 GLSL 4.5 中,请参阅第 84 页的正确性要求,以及第 150 页的函数 length()
和 normalize()
。
此外,GLSL 没有为已编译的着色器代码定义二进制格式;该格式相应地依赖于实现。
但是,一般来说,我假设 length
函数将使用点积和平方根来实现,而 normalize
函数将通过调用 length
函数,还做三除法,或一除法和向量乘法。