Рисование отредактированного значения вершины из VBO

#c# #opengl #opentk

#c# #opengl #opentk

Вопрос:

Я, вероятно, делаю что-то действительно глупое, так что продолжайте и поправьте меня. Я пытаюсь заставить вершину двигаться так…

В OnLoad я настраиваю VBO так, как вы видите. В OnFrameRender я пытаюсь отредактировать вершину, затем я делаю drawArrays . Но я не могу заставить эти изменения отображаться в окне OpenTK. Выполнение ConsoleWrite(prymi.vertOne) показывает мне, что структура отредактирована (я получаю sin от 0 до 20), поэтому я предполагаю, что эти значения не обновляются на GPU. Я пробовал каждый VBO BufferUsageHint (динамический / статический / поток (копирование / рисование / чтение)), и это не тот случай. Я прочитал, что я должен использовать BufferSubData (я еще не знаю об этой концепции (поэтому любая помощь была бы полезна), но редактирование объекта, который передается в качестве ссылки с помощью VBO StreamDraw , также должно это делать … или я ошибаюсь? Спасибо всем 🙂

 struct TrianglePrymi
{

    public Vector2 vertOne;

    public Vector2 vertSec;

    public Vector2 VertThird;

    public TrianglePrymi(Vector2 fi, Vector2 sec, Vector2 thi )
    {
        vertOne = fi;
        vertSec = sec;
        VertThird = thi;
    }
    public void edit(Vector2 a)
    {
        vertOne = a;
    }
    public static int retSize()
    {
        return (3 * Vector2.SizeInBytes);
    }

}
protected override void OnLoad(EventArgs e)
    {

        prymi = new TrianglePrymi(new Vector2(20,20),new Vector2(300,200), new Vector2(530,420));
        ttttt = TrianglePrymi.retSize();
        VBO = GL.GenBuffer();
        GL.BindVertexArray(VAO);
        GL.BindBuffer(BufferTarget.ArrayBuffer, VBO);
        GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)ttttt,ref prymi, BufferUsageHint.DynamicDraw);
        GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
        base.OnLoad(e);

    }



    protected override void OnRenderFrame(FrameEventArgs e)
    {
        Console.WriteLine(prymi.vertOne[0]);
        //Console.WriteLine(prymi.vertSec);
        //Console.WriteLine(prymi.VertThird);
        magicNumber  = 1.00f;
        float x = Math.Abs(20 * (float)Math.Sin(magicNumber));
        float y = Math.Abs(20 * (float)Math.Cos(magicNumber));


        GL.EnableClientState(ArrayCap.VertexArray);
        GL.Clear(ClearBufferMask.ColorBufferBit|ClearBufferMask.DepthBufferBit);





        GL.ClearColor(Color.Gray);

        prymi.edit(new Vector2(x, y));
        Vector2 vec = new Vector2(magicNumber, 450);
        Matrix4 world = Matrix4.CreateOrthographicOffCenter(0, widX, 0, heiY, 0, 2000);
        GL.LoadMatrix(ref world);

        GL.Color3(Color.Yellow);
        prymi.vertOne = vec;
        GL.BindBuffer(BufferTarget.ArrayBuffer, VBO);

        GL.VertexPointer(2, VertexPointerType.Float,Vector2.SizeInBytes, 0);

        GL.DrawArrays(BeginMode.Triangles, 0, 3);

        GL.End();
        GL.Flush();
        base.OnRenderFrame(e);
        this.SwapBuffers();
    }
  

Комментарии:

1. «Я пытаюсь переместить вершину» — Обычный способ «переместить» сетку — использовать и изменять матрицу модели.

2. Я знаю это, и в будущем я буду экспериментировать с мировой матрицей и матрицей проекции, но сейчас я ищу редактирование вектора вершин в VBO!

3. но редактирование объекта, который передается в качестве ссылки с помощью VBO StreamDraw , также должно это делать … или я ошибаюсь? — Да, вы ошибаетесь. StreamDraw это подсказка для использования буфера, но не предоставляет постоянный буфер. Вам пришлось бы использовать отображение буфера с постоянным буфером

4. Используйте GL.BufferSubData для изменения содержимого буфера.

5. @Rabbid76 Спасибо, собираюсь прочитать об этом <3