Wie behebe ich die System.AccessViolationException?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie behebe ich die System.AccessViolationException?

Post by Anonymous »

Ich versuche, mithilfe von Indizes und Eckpunkten ein Quadrat aus Dreiecken zu erstellen, aber wenn ich den Code ausführe, wird Folgendes angezeigt: System.AccessViolationException: „Es wurde versucht, geschützten Speicher zu lesen oder zu schreiben.“ Dies ist oft ein Hinweis darauf, dass anderer Speicher beschädigt ist.'
Hier ist mein Code:

Code: Select all

using OpenTK.Graphics.OpenGL4;
using OpenTK.Windowing.Common;
using OpenTK.Windowing.Desktop;
using OpenTK.Windowing.GraphicsLibraryFramework;

namespace ByteCraftMCknockoff
{
public class BCWindow : GameWindow
{
private readonly float[] vertices =
{
0.5f,  0.5f, 0.0f, //bottom left
0.5f, -0.5f, 0.0f, //bottom right
-0.5f, -0.5f, 0.0f, //top left
-0.5f,  0.5f, 0.0f  //top right
};

private readonly uint[] indices =
{
0, 1, 3,
1, 2, 3
};

private Shader shader;

private int vbo;
private int ebo;
private int vao;

public BCWindow(int width, int height, string title) : base(GameWindowSettings.Default, new NativeWindowSettings() { ClientSize = (width, height), Title = title })
{

}

protected override void OnLoad()
{
base.OnLoad();

var sky = OpenTK.Mathematics.Color4.CornflowerBlue;

GL.ClearColor(sky);

shader = new Shader("shader.vert", "shader.frag");

vbo = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof(float), vertices, BufferUsageHint.StaticDraw);

ebo = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ElementArrayBuffer, ebo);
GL.BufferData(BufferTarget.ElementArrayBuffer, indices.Length * sizeof(uint), indices, BufferUsageHint.StaticDraw);

vao = GL.GenVertexArray();
GL.BindVertexArray(vao);

GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
GL.EnableVertexAttribArray(0);

shader.Use();
}

protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);

if (KeyboardState.IsKeyDown(Keys.Escape))
{
this.Close();
}
}

protected override void OnFramebufferResize(FramebufferResizeEventArgs e)
{
base.OnFramebufferResize(e);

GL.Viewport(0, 0, e.Width, e.Height);
}

protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);

GL.Clear(ClearBufferMask.ColorBufferBit);

shader.Use();

GL.BindVertexArray(vao);

GL.DrawElements(PrimitiveType.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0);

SwapBuffers();
}

public void DrawCube()
{
shader.Use();
GL.BindVertexArray(vao);
GL.DrawElements(PrimitiveType.Triangles, indices.Length, DrawElementsType.UnsignedInt, 3);
}

protected override void OnUnload()
{
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
GL.UseProgram(0);

GL.DeleteBuffer(vbo);
GL.DeleteVertexArray(vao);

GL.DeleteProgram(shader.Handle);

base.OnUnload();
}
}
}
In dieser Zeile steht es konkret:

Code: Select all

GL.DrawElements(PrimitiveType.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0);
Wie kann ich diesen Fehler beheben, damit ich sehen kann, ob ich ein Quadrat erstellt habe oder nicht?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post