Исключение Opengl nvoglv32.dll при выполнении длинных розыгрышей - PullRequest
0 голосов
/ 31 мая 2019

Я использую opengl для рендеринга фракталов, что может привести к очень длинным вызовам отрисовки (несколько секунд). Если вызов отрисовки оказывается слишком длинным (пару секунд), я получаю эту ошибку:
Необработанное исключение в 0x69A5E899 (nvoglv32.dll) в Mandelbulb.exe: запрошен фатальный выход из программы. Предположительно opengl предполагает, что я застрял в бесконечном цикле и поэтому прерывает программу.

Я выделил проблему, так как она исчезнет, ​​если я понизлю качество. (в примере кода обратите внимание, что программа работает нормально, если для maxiterations установлено что-то разумное, например 1000).
Есть ли способ намекнуть opengl, что он не должен прерываться?
Может быть, вместо этого сработают вычислительные шейдеры?

Пример кода для воспроизведения (очень глупый пример, не фокус): создайте проект opengl, нарисуйте два треугольника, которые пересекаются, чтобы сформировать прямоугольник, покрывающий весь экран. Затем используйте этот фрагментный шейдер, чтобы раскрасить его. Vertex:

#version 330 core

layout(location = 0) in vec4 position;

out vec4 pos;
void main()
{
    gl_Position = position;
    pos = position;
};

Фрагмент:

#version 330 core
layout(location = 0) out vec4 color;
in vec4 pos;
const int maxIterations = 8000000;
void main()
{
    vec2 npos = pos.xy;
    vec2 z=vec2(0.0,0.0);
    int i = maxIterations;
    for (; i > 0; i--)
    {
        float y2 = z.y * z.y;
        float x2 = z.x * z.x;
        if (x2 + y2 > 4) break;
        z.y = 2*z.x*z.y+npos.y;
        z.x = x2 - y2 + npos.x;
    }
    color = vec4(float(i)/float(maxIterations));
};

Edit: Попытка того, что рекомендовал @Scheff, сработала. Однако, к сожалению, я не могу принять комментарий в качестве ответа

...