Example #1
0
        private float angle = 0.0f;     // Поворот

        protected override void OnLoad(EventArgs e)
        {
            // цвет для окна
            // сначала на заднем буфере, после на сам экран, иначе было бы мерцающее изображение
            // вызывается один раз, иначе будет логать
            // задает цвет, которым будем очищать наш буфер

            // red, green, blue, alpha
            GL.ClearColor(0.3f, 0.3f, 0.4f, 1.0f);
            // Подключение буфера глубины
            GL.Enable(EnableCap.DepthTest);

            shader = new Shader("Shader.v", "Shader.f");

            mesh = MeshLoader.LoadMesh("deer.obj");

            VertexBufferObject = GL.GenBuffer();

            // Вершины - ArrayBuffer, передается в шейдер
            GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObject);
            GL.BufferData(BufferTarget.ArrayBuffer, mesh.vertices.Length * Unsafe.SizeOf <Vertex>(), mesh.vertices, BufferUsageHint.StaticDraw);

            GL.VertexAttribPointer(shader.GetAttributeLocation("aPosition"), 3, VertexAttribPointerType.Float, false, Unsafe.SizeOf <Vertex>(), 0);
            GL.EnableVertexAttribArray(shader.GetAttributeLocation("aPosition"));

            GL.VertexAttribPointer(shader.GetAttributeLocation("aColor"), 3, VertexAttribPointerType.Float, false, Unsafe.SizeOf <Vertex>(), Unsafe.SizeOf <Vector3>());
            GL.EnableVertexAttribArray(shader.GetAttributeLocation("aColor"));

            // Индексы
            // В шейдер не передается, используется для отрисовки треугольников
            // Создание
            IndexBufferObject = GL.GenBuffer();
            // Привязка
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, IndexBufferObject);
            // Передача данных
            GL.BufferData(BufferTarget.ElementArrayBuffer, mesh.indices.Length * sizeof(uint), mesh.indices, BufferUsageHint.StaticDraw);

            base.OnLoad(e);
        }
        private void SetupRenderState(ImGuiNET.ImDrawDataPtr drawData, int width, int height, int VAO)
        {
            GL.Enable(EnableCap.Blend);
            GL.BlendEquation(BlendEquationMode.FuncAdd);
            GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
            GL.Disable(EnableCap.CullFace);
            GL.Disable(EnableCap.DepthTest);
            GL.Enable(EnableCap.ScissorTest);

            GL.Viewport(0, 0, width, height);

            Matrix4 mvp = Matrix4.CreateOrthographicOffCenter(
                -1.0f,
                width,
                height,
                0.0f,
                -1.0f,
                1.0f);

            _shader.Use();

            GL.UniformMatrix4(_shader.GetUniformLocation("uProjection"), false, ref mvp);

            GL.BindVertexArray(_vertexArray);

            GL.BindBuffer(BufferTarget.ArrayBuffer, _vertexBuffer);
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, _indexBuffer);

            GL.EnableVertexAttribArray(_shader.GetAttributeLocation("aPosition"));
            GL.EnableVertexAttribArray(_shader.GetAttributeLocation("aUV"));
            GL.EnableVertexAttribArray(_shader.GetAttributeLocation("aColor"));

            GL.VertexAttribPointer(_shader.GetAttributeLocation("aPosition"), 2, VertexAttribPointerType.Float, false, Unsafe.SizeOf <ImDrawVert>(), 0);
            GL.VertexAttribPointer(_shader.GetAttributeLocation("aUV"), 2, VertexAttribPointerType.Float, false, Unsafe.SizeOf <ImDrawVert>(), 8);
            GL.VertexAttribPointer(_shader.GetAttributeLocation("aColor"), 4, VertexAttribPointerType.UnsignedByte, true, Unsafe.SizeOf <ImDrawVert>(), 16);
        }