glfwSwapBuffers, вызывающий нарушение прав доступа (только при рендеринге геометрии с использованием glDrawElements) - PullRequest
0 голосов
/ 22 апреля 2020

Для контекста: в настоящее время я разрабатываю приложение C#. NET Core 3.1, которое использует библиотеку OpenGL. Net в сочетании с glfw- net для управления окнами. Насколько мне известно, OpenGL. Net не нуждается в GLEW, поскольку он автоматически разрешает расширения во время выполнения (при условии, что вы вызываете определенную функцию после создания окна / контекста).

Все вызовы OpenGL выполняются в параллельный поток с основным потоком обновления, и я гарантировал, что нет никаких вызовов вне потока рендеринга. Кроме того, любые данные, используемые как потоком обновления, так и потоком рендеринга, копируются в отдельное состояние (RenderState), так что данные для следующего фрейма рендеринга могут быть вычислены, в то время как поток рендеринга рендерит последний фрейм. Я использую VAO для рендеринга геометрии stati c с использованием glDrawElements и выполнил расширенную отладку (теперь несколько дней смотрю на то, как выглядит каждое сообщение на форуме под солнцем), чтобы убедиться, что с буферными объектами нет ошибок, данные, хранящиеся внутри них, шейдеры / униформы, которые они используют, или объекты текстур, которые они используют (а это - texture2Darray, если вам интересно).

Проблема заключается в следующем: после рендеринга этих объектов используя glDrawElements, я вызываю glfwSwapBuffers, а затем получаю нарушение прав доступа (0xc0000005), вызывая сбой моей программы. Я попытался запустить его без отладчика, в сборке выпуска, нацеливания. NET Core 2.0 вместо 3.1, и даже альтернативные формы DLL GLFW, которые я использую безрезультатно (кстати, используя VS 2019) .

Следует отметить, что проблема не возникает, если не вызывается glDrawElements, или, наоборот, если не вызывается glfwSwapBuffers. Кроме того, я доказал, что это не проблема с невозможностью получить информацию о цвете в окне, так как glClearColor работает просто отлично. В тот момент, когда необходимо отобразить любую геометрию, она падает.

EDIT : Забыл заметить, что он успешно рендерит несколько кадров перед сбоем, по-видимому, без видимой причины. Гадость.

Мой вопрос, проще говоря: что в мире может вызвать это? Я чувствую, что схожу с ума, прямо скажем. И да, я знаю, что означает ошибка. РЕДАКТИРОВАТЬ : Знание того, почему glfwSwapBuffers может вызвать нарушение доступа к памяти, скорее всего, поможет.

Код для рендеринга l oop:

while (Game.StopIssued == false) {
    using NativeWindow w = new NativeWindow (Settings.WindowSizeX, Settings.WindowSizeY, Game.Version, m, Window.None);
    Glfw.MakeContextCurrent (w);
    Gl.BindAPI ();
    Shaders.Initialize ();
    VoxelTypes.CreateTileTexture ();

    Threading.CurrentWindow = w;
    Gl.Viewport (0, 0, w.ClientSize.Width, w.ClientSize.Height);

    while (w.IsClosing == false) {
        Threading.FrameFinished.WaitOne ();

        Glfw.PollEvents ();
        Threading.InputHandle.Set ();

        RenderFrame ();
        Glfw.SwapBuffers (w);
    }

    if (Game.ResolutionChange == false) {
        Game.StopIssued = true;
    }
}

Код для glDrawElements:

public static void RenderTiles (Matrix4x4 view, Matrix4x4 projection) {
    RenderState.UpdateTiles ();

    Shaders.TileShader.Use ();
    Gl.BindTexture (TextureTarget.Texture2dArray, VoxelTypes.TileTexture.ID);
    Gl.UniformMatrix4f (Shaders.TileShader.UniformView, 1, false, view);
    Gl.UniformMatrix4f (Shaders.TileShader.UniformProjection, 1, false, projection);

    foreach (KeyValuePair<Vector3Int, TileRenderObject> entry in RenderState.TRO) {
        Matrix4x4 model = Matrix4x4.CreateTranslation ((entry.Key - RenderState.FocalPoint) * Tile.Size);
        Gl.UniformMatrix4f (Shaders.TileShader.UniformModel, 1, false, model);
        Gl.BindVertexArray (entry.Value.VAO);
        Gl.DrawElements (PrimitiveType.Triangles, entry.Value.Length, DrawElementsType.UnsignedInt, 0);
        Gl.BindVertexArray (0);

    }

    Gl.BindTexture (TextureTarget.Texture2dArray, 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...