OpenTK. Проблема с методом GL.DrawElements
Я изучаю openTK по учебнику
Вот ссыль: https://opentk.net/learn/chapter1/3-element-buffer-objects.html
Раздел "Element Buffer Objects"
Вроде все сделал как там написано, но когда я ввел последнюю строку кода
GL.DrawElements(PrimitiveType.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0);
то получил несколько ошибок
CS1503: Аргумент 1: не удается преобразовать из "OpenTK.Graphics.ES30.PrimitiveType" в "OpenTK.Graphics.ES30.All"
CS1503: Аргумент 3: не удается преобразовать из "OpenTK.Graphics.ES30.PrimitiveType" в "OpenTK.Graphics.ES30.All"
CS1503: Аргумент 4: не удается преобразовать из "int" в "System.IntPtr"
Ладно, хоть это не так как написано в учебнике, я изменил этот метод на
GL.DrawElements(All.Triangles, indices.Length, All.UnsignedInt, (IntPtr)0);
потому что это единственное решение, которое я увидел. И эти ошибки пропали, но когда я запустил код, то получил
System.AccessViolationException: "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Теперь я не знаю что делать, надеюсь на чью - то помощь, ниже прикрепляю мой код класса Game
internal class Game : GameWindow
{
readonly float[] vertices =
{
0.5f, 0.5f, 0.0f, // top right
0.5f, -0.5f, 0.0f, // bottom right
-0.5f, -0.5f, 0.0f, // bottom left
-0.5f, 0.5f, 0.0f // top left
};
uint[] indices =
{ // note that we start from 0!
0, 1, 3, // first triangle
1, 2, 3 // second triangle
};
int VertexBufferObject;
int VertexArrayObject;
int ElementBufferObject;
Shader shader;
public Game(int width, int height, string title) : base(width, height, GraphicsMode.Default, title)
{
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
GL.ClearColor(0.2f, 0.3f, 0.3f, 1.0f);
VertexBufferObject = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObject);
GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof(float), vertices, BufferUsageHint.StaticDraw);
ElementBufferObject = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ElementArrayBuffer, ElementBufferObject);
GL.BufferData(BufferTarget.ElementArrayBuffer, indices.Length * sizeof(uint), indices, BufferUsageHint.StaticDraw);
VertexArrayObject = GL.GenVertexArray();
GL.BindVertexArray(VertexArrayObject);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
GL.EnableVertexAttribArray(0);
shader = new Shader("shader.vert", "shader.frag");
shader.Use();
//Code goes here
}
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
GL.Clear(ClearBufferMask.ColorBufferBit);
shader.Use();
GL.BindVertexArray(VertexArrayObject);
GL.DrawElements(All.Triangles, indices.Length, All.UnsignedInt, (IntPtr)0);
//Code goes here.
SwapBuffers();
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
GL.Viewport(0, 0, Width, Height);
}
protected override void OnUnload(EventArgs e)
{
base.OnUnload(e);
// Unbind all the resources by binding the targets to 0/null.
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
GL.UseProgram(0);
// Delete all the resources.
GL.DeleteBuffer(VertexBufferObject);
GL.DeleteVertexArray(VertexArrayObject);
GL.DeleteProgram(shader.Handle);
}
}
Ответы (1 шт):
Видимо это ошибка в учебнике либо там используется более старая версия.
Последним параметром должен быть indices, тогда в окне мы увидим искомый прямоугольник.
GL.DrawElements(PrimitiveType.Triangles, indices.Length, DrawElementsType.UnsignedInt, indices);