【问题标题】:Julia set in GLSL朱莉娅在 GLSL 中设置
【发布时间】:2014-03-29 10:43:02
【问题描述】:

我正在尝试使用牛顿迭代显示 Julia 集,但得到的结果如下所示。 可能是什么问题呢? 这是我的 EDIT: FIXED, WORKING 代码:

#version 130

in vec3 vs_out_col;
in vec3 vs_out_pos;

out vec4 fs_out_col;

vec2 cplx_mul(vec2 z1, vec2 z2)
{
    return vec2(z1.x * z2.x - z1.y * z2.y, z1.y * z2.x + z1.x * z2.y); 
}

vec2 cplx_div(vec2 z1, vec2 z2)
{
    float denom = z2.x * z2.x + z2.y * z2.y;
    return vec2(
                (z1.x * z2.x + z1.y * z2.y) / denom,
                (z1.y * z2.x - z1.x * z2.y) / denom
            );
}

vec2 f(vec2 z)
{
    vec2 res = cplx_mul(cplx_mul(z, z), z);
    return vec2(res.x - 1.0f, res.y);
}

vec2 f_der(vec2 z)
{
    return 3 * cplx_mul(z, z);
}

void main()
{
    vec2 z = vs_out_pos.xy;

    for(int i = 0; i < 30; ++i){
        z = z - cplx_div(f(z), f_der(z));
    }

    vec2 root1 = vec2( 1.0f     ,  0.0f);
    vec2 root2 = vec2(-1.0f/2.0f,  1.0f/2.0f * sqrt(3.0f));
    vec2 root3 = vec2(-1.0f/2.0f, -1.0f/2.0f * sqrt(3.0f));

    if(abs(length(z - root1)) < 0.5f){
        fs_out_col = vec4 (1, 0, 0, 1);
    }
    else if(abs(length(z - root2)) < 0.01f){
        fs_out_col = vec4 (0, 1, 0, 1);
    }
    else if(abs(length(z - root3)) < 0.01f){
        fs_out_col = vec4 (0, 0, 1, 1);
    }
    else{
        fs_out_col = vec4 (0, 0, 0, 1);
    }
}

结果如下: 而Fixed结果:

【问题讨论】:

  • 你真的想要一个黑色片段(0,0,0,1) 用于第三个 if/else 条件吗?
  • 不,我希望它是 (0, 0, 1, 0) 谢谢!

标签: graphics glsl shader fractals newtons-method


【解决方案1】:

您应该正确计算导数,f(z)=z^3-1 的导数是 f'(z)=3*z^2,缺少因子 3。

常数 1.0f 的减法真的那么简单吗?

【讨论】:

  • 该死的,我很确定在导数中我没有计算它。这就是结果……非常感谢,现在它可以工作了,但是我不得不将错误限制更改为 0.5f。我已经添加了固定代码。是的,我测试了 vec2 - 1.0f 的工作原理:)
  • 当然 - 1.0f 不起作用,它同时减去 x 和 y 成员,你说得对,现在我可以将限制设置为 0.01f,谢谢
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2014-12-31
  • 2017-01-15
相关资源
最近更新 更多