Как я могу представить число с большей точностью, чем float, используя только числа с плавающей точкой и / или - PullRequest
1 голос
/ 18 октября 2011

Я написал шейдер MandelBrot, основанный на этом: http://blogs.msdn.com/b/shawnhar/archive/2006/12/11/sixty-fractals-per-second.aspx

float4 PixelShader(float2 texCoord : TEXCOORD0) : COLOR0
{
    float2 c = (texCoord - 0.5) * Zoom * float2(1, Aspect) - Pan;
    float2 v = 0;

    for (int n = 0; n < Iterations; n++)
    {
        v = float2(v.x * v.x - v.y * v.y, v.x * v.y * 2) + c;
    }

    return (dot(v, v) > 1) ? 1 : 0;
}

Я бы хотел увеличить величину, на которую можно увеличить, используя что-то с большей точностью, чем с плавающей точкой. Я прочитал несколько вещей в Интернете, таких как http://www.bealto.com/mp-mandelbrot_fp128-opencl.html, однако, это довольно сложно понять и неполно.

Используемый мной графический процессор не поддерживает double, поэтому я застрял с 32-битными целочисленными значениями и числами с плавающей запятой (и векторами / массивами с плавающей запятой длиной до 4).

Как я могу представить одно число с плавающей запятой более точным способом, чем это допускает обычный метод с плавающей запятой?

Операции, которые мне нужно поддерживать: x , + , - и (> или > = )

Я использую модель пиксельного шейдера 3.0.


Я посмотрел на Q числовой формат , однако проблема, с которой я столкнулся, заключается в том, что если я использую 2 32-битных числа, мне нужна 64-битная временная переменная для умножения (и деления).

1 Ответ

2 голосов
/ 18 октября 2011

В следующем посте блога рассматриваются некоторые из описанных вами проблем, в том числе эмуляция двойной точности с использованием 2-х чисел в GLSL.

http://www.thasler.org/blog/?p=93

Погуглив «эмулированная двойная точность», должно появиться еще несколько ссылок.

...