像素着色器中的Mandelbrot

2024-10-17 06:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在为DirectX 11版本的Mandelbrot集工作几天。到目前为止,我所做的是创建一个带有纹理的四边形。我可以使用像素着色器为点着色,但由于某些原因,像素着色器中的Mandelbrot集不会返回预期结果。我用C++代码测试了逻辑,结果相同。知道密码有什么问题吗?我有一个使用Python的正确版本,我只是复制了代码,但似乎缺少了一些东西

设置的宽度为2.5(将使图像略微拉伸)。它假设一个1024*960的窗口,最大迭代次数为1000次。我使用Shader Model 5.0编译。它以默认设置为开始

RealStart = -2.0;
ImagStart = -1.25;

通过常量缓冲区传递

cbuffer cBuffer
{
    double RealStart; 'equals -2.5 from the default view of the set
    double ImagStart; 'equals -1.25 from the default view of the set
};

// Pixel Shader
float4 main(float4 position : SV_POSITION) : SV_TARGET
{
    double real, imag;
    double real2, imag2;
    int ite = 0;
    float4 CalcColor = { 1.0f , 1.0f, 1.0f, 1.0f };
    'position is the position of the pixel from 1.0f to 0.0f
    real = RealStart + (double) position.x / 1024 * 2.5;
    imag = ImagStart + (double) position.y / 960 * 2.5;

    for (int i = 0; i < 1000; i++)
    {
        'breaking down the complex number by its constituents
        real2 = real * real;
        imag2 = imag * imag;

        if (real2 + imag2 > 4.0)
        {
            break;
        }
        else {
            imag = 2 * real * imag + ImagStart;
            real = real2 - imag2 + RealStart;
            ite++;
        }
    }

    CalcColor[0] = (float) (ite % 333) / 333 ;
    CalcColor[1] = (float) (ite % 666) / 666 ;
    CalcColor[2] = (float) (ite % 1000) / 1000;

    return CalcColor;
}

编辑Python版本

def Mandelbrot(creal, cimag, maxNumberOfIterations):
    real = creal
    imag = cimag

    for numberOfIterations in range(maxNumberOfIterations):
        real2 = real * real
        imag2 = imag * imag

        if real2 + imag2 > 4.0:
            return numberOfIterations

        imag = 2 * real * imag + cimag
        real = real2 - imag2 + creal

    return maxNumberOfIterations

creal、cimag和cimag就是这样创建的,然后循环通过

realAxis = np.linspace(realStart, realStart + width, dim)
imagAxis = np.linspace(imagStart, imagStart + width, dim)

它将maxNumberOfIterations返回到一个二维数组,该数组用于绘制Mandelbrot集


Tags: thepositionrealdoubleitemandelbrotimagimag2
1条回答
网友
1楼 · 发布于 2024-10-17 06:25:16

错误是Else中的ImagStart和RealStart也需要缩放。着色器中的代码已修改如下:

cbuffer cBuffer
{
    double2 C;
    float2 Param;
    float MaxIt;
};


// Pixel Shader
float4 main(float4 position : SV_POSITION, float2 texcoord : TEXCOORD) : SV_TARGET
{
    double real, imag;
    double real2, imag2;
    uint ite = 0;
    float4 CalcColor = { 1.0f , 1.0f, 1.0f, 1.0f };

    real = C.x + ((double) texcoord.x - 0.5) * 2.0 * 2.5;
    imag = C.y + ((double) texcoord.y - 0.5) * 2.0 * 2.5;

    for (int i = 0; i < 100; i++)
    {
        real2 = real * real;
        imag2 = imag * imag;

        if (real2 + imag2 > 4.0)
        {
            break;
        }
        else {
            imag = 2 * real * imag + C.y + ((double) texcoord.y - 0.5) * 2.0 * 2.5;
            real = real2 - imag2 + C.x +   ((double) texcoord.x - 0.5) * 2.0 * 2.5;
            ite++;
        }
    }

    if (ite > 100)
        ite = 100;

    CalcColor[0] = (float)(ite % 33) / 33;
    CalcColor[1] = (float)(ite % 66) / 66;
    CalcColor[2] = (float)(ite % 100) / 100;

    return CalcColor;
}

曼德尔布罗特设定正确绘制。 Mandelbrot set

相关问题 更多 >