Mandelbrot设置片段着色器版本330

时间:2014-08-25 02:10:43

标签: opengl glsl fractals

我试图在片段着色器上设置Mandelbrot。我最初构建一个矩形,并使用gl_FragCoords来计算算法。这是代码:

#version 330 core

uniform float MaxIterations;

out vec4 pixelColor;

void main()
{
    float   real  = gl_FragCoord.x;
    float   imag  = gl_FragCoord.y;
    float   Creal = real;  
    float   Cimag = imag;  

    float r2 = 0.0;

    for (float iter = 0.0; iter < MaxIterations && r2 < 4.0; ++iter)
    {
        float tempreal = real;

        real = (tempreal * tempreal) - (imag * imag) + Creal;
        imag = 2.0 * tempreal * imag + Cimag;
        r2   = (real * real) + (imag * imag);
    }

    vec3 color;

    if (r2 < 4.0)
        color = vec3(0.0f, 0.0f, 0.0f);
    else
        color = vec3(1.0f, 1.0f, 1.0f);

    pixelColor = vec4(color, 1.0);
}

这段代码实际上是我在互联网上找到的简化版本。我假设y轴为虚轴,x轴为实部。然后我计算迭代直到统一通过最大值。它应该显示一个黑色和白色的矩形(在集合外部为白色,内部为黑色),但我只是得到一个白色矩形。有谁知道出了什么问题?

编辑:添加更多细节。 这是我用于矩形的顶点

GLfloat vertices[] = {
        0.9f, 0.9f,     
        0.9f, -0.9f,    
        -0.9f, -0.9f, 
        -0.9f, 0.9f 
    };

这里是顶点着色器:

#version 330 core

layout (location = 0) in vec2 position;

void main() {
    gl_Position = vec4(position, 0.0f, 1.0f);
}

1 个答案:

答案 0 :(得分:2)

对于一个mandlebrot集,像素坐标有多大输入值吗?尝试从顶点着色器创建表示顶点坐标的新输出,并将其用作片段着色器中的输入:

layout (location = 0) in vec2 position;
out vec2 coord;

void main() {
    gl_Position = vec4(position, 0.0f, 1.0f);
    coord = position.xy
}

在片段着色器中:

#version 330 core

uniform float MaxIterations;

out vec4 pixelColor;
in vec2 coord;

void main()
{
    float   real  = coord.x;
    float   imag  = coord.y;

(...)