Я использую 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, сработала. Однако, к сожалению, я не могу принять комментарий в качестве ответа