OpenGL - загрузка вершин, индексов и обозначенных векторов для освещения - PullRequest
0 голосов
/ 12 мая 2018

В настоящее время я пытаюсь включить освещение в моем приложении OpenTK. Я использую учебник https://learnopengl.com/Lighting/Basic-Lighting. В нем они загружают все свои вершины вместе с нормализованными векторами для направления граней для использования при рассеянном освещении. Проблема в том, что я использую ElementArrayBuffer (индексы) вместе с моим ArrayBuffer (вершины), и я не могу понять, как загрузить нормализованные векторы. Я не могу объединить их с вершинами, потому что они соответствуют граням, а не точкам. Вот мои очки:

         Vector3[] vertices = {     //s is the size of the cube
            new Vector3(s, s, s),   //0
            new Vector3(s, s, -s),  //1
            new Vector3(-s, s, -s), //2
            new Vector3(-s, s, s),  //3

            new Vector3(s, -s, s),  //4
            new Vector3(s, -s, -s), //5
            new Vector3(-s, -s, -s),//6
            new Vector3(-s, -s, s), //7
        };
        Vector3[] normals =
        {
            Vector3.UnitY,
            Vector3.UnitX,
            Vector3.UnitZ,
            -Vector3.UnitZ,
            -Vector3.UnitX,
            -Vector3.UnitY,
        };
        int[] indices =
        {
            0, 1, 3, 1, 2, 3, //normals[0]
            1, 0, 4, 1, 5, 4, //normals[1]
            3, 0, 4, 3, 7, 4, //normals[2]
            1, 2, 6, 1, 5, 6, //normals[3]
            3, 2, 6, 3, 7, 6, //normals[4]
            4, 5, 6, 4, 7, 6, //normals[5]
        };

Как эффективно объединить нормализованные данные с вершинами, чтобы передать их шейдерам в GL.bufferData?

UPDATE *

Мне не нужна помощь в объединении данных, мне нужна помощь в их обработке.

Я пытался поместить нормали в массив вершин следующим образом:

        Vector3[] vertices = {
            new Vector3(s, s, s),   //0
            new Vector3(s, s, -s),  //1
            new Vector3(-s, s, -s), //2
            new Vector3(-s, s, s),  //3

            new Vector3(s, -s, s),  //4
            new Vector3(s, -s, -s), //5
            new Vector3(-s, -s, -s),//6
            new Vector3(-s, -s, s), //7

            Vector3.UnitY,  //8
            Vector3.UnitX,  //9
            Vector3.UnitZ,  //10
            -Vector3.UnitZ, //11
            -Vector3.UnitX, //12
            -Vector3.UnitY, //13
        };

        int[] indices =
        {
            0,  8, 1,  8, 3,  8, 1,  8, 2,  8, 3,  8,
            1,  9, 0,  9, 4,  9, 1,  9, 5,  9, 4,  9,
            3, 10, 0, 10, 4, 10, 3, 10, 7, 10, 4, 10,
            1, 11, 2, 11, 6, 11, 1, 11, 5, 11, 6, 11,
            3, 12, 2, 12, 6, 12, 3, 12, 7, 12, 6, 12,
            4, 13, 5, 13, 6, 13, 4, 13, 7, 13, 6, 13,
        };

Я пытался указать 1-му взгляду взглянуть на все остальные индексы, а 2-му взглянуть на остальные, но он не отображается должным образом ... Разве индексы не работают так?

Мои настройки и код рендеринга:

        GL.BufferData(BufferTarget.ArrayBuffer, sizeof(float) * Vertices.Length * 3, Vertices, BufferUsageHint.DynamicDraw);
        GL.BufferData(BufferTarget.ElementArrayBuffer, sizeof(int) * Indices.Length, Indices, BufferUsageHint.DynamicDraw);

        //format data and enable attributes 4 shaders
        GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 6 * sizeof(float), 0);
        GL.EnableVertexAttribArray(0);

И

GL.DrawElements(BeginMode.Triangles, Indices.Length, DrawElementsType.UnsignedInt, 0);

Мне было интересно, не работала ли функция Draw из-за того, как она смотрела на индексы, так? 1023 *

...