Для контекста: в настоящее время я разрабатываю приложение 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);
}