GLSL double 复数幂函数

标签 glsl

我目前定义了以下 GLSL 函数,用于计算复数的幂。

dvec2 p2 (dvec2 t) {return (dvec2 (cmul(t,t) ));}
dvec2 p3 (dvec2 t) {return (dvec2 (cmul(cmul(t,t),t) ));}
dvec2 p4 (dvec2 t) {return (dvec2 (cmul(cmul(cmul(t,t),t),t) ));}
dvec2 p5 (dvec2 t) {return (dvec2 (cmul(cmul(cmul(cmul(t,t),t),t),t) ));}
dvec2 p6 (dvec2 t) {return (dvec2 (cmul(cmul(cmul(cmul(cmul(t,t),t),t),t),t) ));}
dvec2 p7 (dvec2 t) {return (dvec2 (cmul(cmul(cmul(cmul(cmul(cmul(t,t),t),t),t),t),t) ));}
dvec2 p8 (dvec2 t) {return (dvec2 (cmul(cmul(cmul(cmul(cmul(cmul(cmul(t,t),t),t),t),t),t),t) ));}

我可以在像这样的复数公式中使用这些

dvec2 func (dvec2 z) { return (dvec2( cadd(csub(p4(z),cmul(c5,p2(z))),c4) ));

而且效果很好。

现在我想摆脱那些 p2、p3、p4 等函数并编写一个更通用的幂函数。所以我尝试了以下

dvec2 cpow (dvec2 c, int p) {
    for (int i = 0; i < p; i++) {
    c=cmul(c,c);
    }
    return c;
}

然后我称之为

dvec2 func   (dvec2 z) { return (dvec2( cadd(csub(cpow(z,4),cmul(c5,cpow(z,2))),c4) )); }

但它给出了不同的结果。我可以在网上找到很多复杂的电源例程,但它们都使用 log 和 trig 调用,这些调用不是 double 的,而我需要此 GLSL 代码。

任何 GLSL 专家都可以找出为什么那个简单的 cpow 循环不起作用吗?

最佳答案

您的转换公式是错误的...因为您乘以子结果意味着您得到的是平方而不是乘法...您必须将函数更改为:

dvec2 cpow (dvec2 c, int p) 
    {
    dvec2 a=(1.0,0.0); // assuming a.x is real part
    for (int i = 1; i <= p; i++) a=cmul(a,c);
    return a;
    }

如果你想要更快的东西,你可以使用 power by squaring甚至端口到极地表示在那里做电源并转换回笛卡尔形式的复数。有关详细信息,请参阅:

在四分形的 GLSL 代码中寻找 vec2 cpow(vec2 a,vec2 b)//a^b

关于GLSL double 复数幂函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66446224/

相关文章:

c++ - 纹理中的 OpenGL 片段着色器

c++ - 现代 Opengl 的 2D 形状坐标

c++ - 基于物理的渲染结果看起来不正确

c++ - OpenGL、C++、输入输出变量

glsl - 在 Three.js 着色器上启用扩展

opengl - 如何在不创建窗口的情况下检查 OpenGL 和 GLSL 版本?

c++ - 如何通过缓冲区纹理正确地将 16 位整数发送到 GLSL 着色器

opengl - 统一点数组和管理片段着色器坐标系

c++ - 如何使用 C++ 软件实际交付 GLSL 着色器

c++ - 如何在 opengl Tessellation Evaluation 着色器中插入矩阵