Модели OpenGL, перекрывающие предыдущие - PullRequest
0 голосов
/ 22 мая 2018

Я уже давно пытаюсь выяснить эту ошибку в своем коде, и теперь я ищу помощь от stackoverflow!Во всяком случае, я создал класс для создания модели в openGL.Он обрабатывает VBO, VAO и EBO для данной модели, но когда я создаю две и отображаю их, вторая всегда переопределяет предыдущую / одну. Я понятия не имею, почему, я показала ее своему другу, и вместе мыничего не понял.Это класс модели:

using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL4;
using System;

namespace YISOPENGLEVIL.Components.Objects
{
struct Vertex
{
    Vector3 Position;
    Vector3 Color;
    public Vertex(Vector3 position, Vector3 color)
    {
        Position = position;
        Color = color;
    }
}
class Model
{
    public int VBO, VAO, EBO;
    public Vertex[] Data;
    public int[] Indices;
    public Model() { }
    public Model(Vertex[] data, int[] indices)
    {
        Data = data;
        Indices = indices;

        VAO = GL.GenVertexArray();
        VBO = GL.GenBuffer();
        EBO = GL.GenBuffer();
        GL.BindVertexArray(VAO);
        GL.BindBuffer(BufferTarget.ArrayBuffer, VBO);
        GL.BufferData(BufferTarget.ArrayBuffer, Data.Length * 24, Data, BufferUsageHint.StaticDraw);
        GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 24, 0);
        GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, false, 24, 12);

        GL.BindBuffer(BufferTarget.ElementArrayBuffer, EBO);
        GL.BufferData(BufferTarget.ElementArrayBuffer, Indices.Length * 4, Indices, BufferUsageHint.StaticDraw);

        GL.EnableVertexAttribArray(0);
        GL.EnableVertexAttribArray(1);
    }
    protected static Vector3 toVec3(Color4 c)
    {
        return new Vector3(c.R, c.G, c.B);
    }
    public void Render()
    {
        //GL.DrawArrays(PrimitiveType.Triangles, 0, Data.Length);
        GL.DrawElements(BeginMode.Triangles, Indices.Length, DrawElementsType.UnsignedInt, 0);
    }
}
}

и мой класс Element, которому передается модель, затем используется для его отображения,

using OpenTK;
using System.Collections.Generic;
using OpenTK.Graphics.OpenGL4;

namespace YISOPENGLEVIL.Components.Objects
{
class Element
{
    private int transform;
    private int s;
    public Vector3 Position;
    public Vector3 Rotation;
    private Matrix4 View;
    private Model Model;

    public Element(Model m, int Shader)
    {
        s = Shader;
        Model = m;
        Position = new Vector3(0, 0, 0);
        Rotation = new Vector3(0, 0, 0);
    }
    public void Render()
    {
        var t = Matrix4.CreateTranslation(Position.X, Position.Y, Position.Z);
        var rx = Matrix4.CreateRotationX(Rotation.X);
        var ry = Matrix4.CreateRotationY(Rotation.Y);
        var rz = Matrix4.CreateRotationZ(Rotation.Z);

        View = t * rx * ry * rz;

        transform = GL.GetUniformLocation(s, "transform");
        GL.UniformMatrix4(transform, false, ref View);

        Model.Render();
    }
    public static void RenderAll()
    {

    }
}
}

, и это реализация:

        m1 = new Cube(1.5f, Color4.Aqua);
        m2 = new Cube(1f, Color4.Red);
        e1 = new Element(m1, s.Program);
        e2 = new Element(m2, s.Program);
        e1.Position = new Vector3(0, 0, 0);
        e2.Position = new Vector3(0, 0, 1);

и:

        e1.Render();
        e2.Render();

Класс куба расширяет модель и передает данные в конструктор модели с помощью частных статических методов, которые создают массивы вершин.Действительно странно то, что если я помещаю операторы print, это показывает, что оба элемента определены хорошо и имеют правильные данные, последний всегда переопределяет предыдущий (два объекта находятся в правильных позициях, но оба отображают красный меньший куб),Я не понимаю ... Любые идеи?

Скриншот программыScreenshot of the program

...