Войти
OpenGL communityФорумВопросы по программированию

C# + OpenTK + VBO не выводит изображение

#0
22:33, 1 июня 2014

Добрый день!
Переделываю OpenGL уроки с выводом изображения через VBO, для вывода использую OpenTK, вывожу на GLControl.
Необходимо вывести точки с координатами хранящиеся в списке на экран.
При попытке отобразить, только черный экран. Предполагаю, что проблема при выделение памяти под точки.
Помогите пожалуйста разобраться.

        public Vector2[] vVertexData = null;
        public int[] vVertexColorData = null;
        public uint[] vVertexIndices = null;

        // Variables for the graphics card handles
        public int colorBufferID;
        public int vertexBufferID;
        public int indiciesBufferID;
        public int elementCount = 0;

 private void vbo()
        {
            GL.ClearColor(Color.White);
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            GL.MatrixMode(MatrixMode.Projection);
            GL.LoadIdentity();
            GL.Viewport(0, 0, AnT.Width, AnT.Height);
            GL.Ortho(0, gr.sizeOfX, 0, gr.sizeOfY, -1, 1);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();

            //-----------------------------Помещаем координаты вершин в массив
            List<Vector2> V_Vector2_l = new List<Vector2>();
            List<int> C_Vector2_l = new List<int>();
            List<uint> I_Vector2_l = new List<uint>();
            uint i = 0;
            foreach (P_Vertex pv in gr.VertList.Values)
            {
                i++;
                V_Vector2_l.Add(new Vector2((float)pv.x, (float)pv.y));
                C_Vector2_l.Add(ColorToRgba32(Color.DarkCyan));
                I_Vector2_l.Add(i);
                if (i == 9) i=0;
            }
            vVertexData = V_Vector2_l.ToArray();
            vVertexColorData = C_Vector2_l.ToArray();
            vVertexIndices = I_Vector2_l.ToArray();
            int bufferSize;


            if (vVertexColorData != null)
                GL.GenBuffers(1, out colorBufferID);
                GL.BindBuffer(BufferTarget.ArrayBuffer, colorBufferID);
                GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vVertexColorData.Length *  sizeof(int)), vVertexColorData, BufferUsageHint.StaticDraw);
                GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out bufferSize);
                if (vVertexColorData.Length * sizeof(int) != bufferSize)
                    throw new ApplicationException("Vertex array not uploaded correctly");
                GL.BindBuffer(BufferTarget.ArrayBuffer, 0);

     

            //vVertexData
            GL.GenBuffers(1, out vertexBufferID);
            GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferID);
            GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vVertexData.Length * 2 * sizeof(float) ), vVertexData, BufferUsageHint.DynamicDraw);
            GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out bufferSize);
            if (vVertexData.Length * 2 * sizeof(float) != bufferSize)
                throw new ApplicationException("Vertex array not uploaded correctly");
            GL.BindBuffer(BufferTarget.ArrayBuffer, 0);

            //vVertexIndices
            GL.GenBuffers(1, out indiciesBufferID);
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, indiciesBufferID);
            GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(vVertexIndices.Length * sizeof(int)), vVertexIndices, BufferUsageHint.StaticDraw);
            GL.GetBufferParameter(BufferTarget.ElementArrayBuffer, BufferParameterName.BufferSize, out bufferSize);
            if (vVertexIndices.Length * sizeof(int) != bufferSize)
                throw new ApplicationException("Element array not uploaded correctly");
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
            elementCount = vVertexIndices.Length;

        
            if (vertexBufferID == 0)
                return;
            if (indiciesBufferID == 0)
                return;

            // Color Array Buffer (Colors not used when lighting is enabled)
            if (colorBufferID != 0)
            {
                // Bind to the Array Buffer ID
                GL.BindBuffer(BufferTarget.ArrayBuffer, colorBufferID);
                // Set the Pointer to the current bound array describing how the data ia stored
                GL.ColorPointer(1, ColorPointerType.UnsignedByte, sizeof(int), IntPtr.Zero);
                // Enable the client state so it will use this array buffer pointer
                GL.EnableClientState(ArrayCap.ColorArray);
            }

            // Vertex Array Buffer
            {
                // Bind to the Array Buffer ID
                GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferID);
                // Set the Pointer to the current bound array describing how the data ia stored
                GL.VertexPointer(2, VertexPointerType.Float, vVertexData.Length * sizeof(float), IntPtr.Zero);
                // Enable the client state so it will use this array buffer pointer
                GL.EnableClientState(ArrayCap.VertexArray);
            }

            // Element Array Buffer
            {
                // Bind to the Array Buffer ID
                GL.BindBuffer(BufferTarget.ElementArrayBuffer, indiciesBufferID);
                GL.DrawArrays(BeginMode.Points, 0, 1);
              }

            GLControl1.SwapBuffers();
        }


#1
17:25, 2 июня 2014

Так... Со вчерашнего дня ни кто даже не ответил.
Voltoz, давай ка начнем, пожалуй, с малого. Скажи вот, ты эту самую vbo() дергаешь на каждом кадре?

#2
23:20, 3 июня 2014

Итак, пока ждал ответа, сам нашел решением проблемы. Возникли другие вопросы, сразу извиняюсь, если задаю глупые вопросы, новичок в этом деле,
очень буду благодарен если вы на них ответите:
1) Имеется массив вершин (Vector2d - x,y) и индексов (каждый индекс уникален), необходимо в массиве брать каждые 22 координаты и рендерить в TriangleFan. Как это правильно реализовать?
2) И вопрос сразу на будущее, если возникнет необходимость изменить данные в массиве, например координаты точки(точек), как лучше делать? (говорят рано или поздно прийду к шейдерам)

Сейчас, для визуализации в glControl, при работе с ним запускается таймер в котором запускается функция прорисовки содержимого буфера.

#3
21:48, 9 июня 2014

На первый вопрос сам отвечу:

                    GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferID); 
                    GL.VertexPointer(2, VertexPointerType.Float, 0, IntPtr.Zero);
                    GL.EnableClientState(ArrayCap.VertexArray);
                    co = indicesVboData.Length / 22;
                    GL.MultiDrawArrays(BeginMode.TriangleFan, startingElements, countElements, co);
                    Где startingElements это массив индексов с которых начинается отрисовка TriangleFan, countElements  - сколько элементов будет взято для отрисовки, co - какое количество раз это должно произойти (вызов DrawArrays).

#4
22:05, 9 июня 2014

Народ, подскажите пожалуйста как реализовать вывод текста при помощи vbo?
Стоит задача вывести по всему GLControl,  большое количество текста (20к-60к) как подписи к вершинам. (1 подпись - 1 битмап).

Я как понимаю,:
1) Переводим текст в битмап.
2) Рисуем Quads с текстурой битмапа.

Но возникает вопрос в чем хранить такое количество битмапов - список?! или  еще 1 массив для vbo?, но как в массиве хранить текстуру?!
И как потом визуализировать этот массив Quads с различными битмапами, что мы создали. Мб копаю не в том направление, и нужно смотреть в сторону FreeType, прошу совета!
Дело в том, что перевожу свой проект на VBO, если геометрические фигуры перенеслись нормально, то с текстом я застрял.

OpenGL communityФорумВопросы по программированию

Тема в архиве.