/// <summary> /// Function updates buffer with verticies /// </summary> /// <param name="buffer">Full buffer</param> /// <param name="bufferData">Array with data</param> /// <param name="bufferIndex">Index of changing buffer</param> public static void updateVertexBufferFully(VAO buffer, VBOArrayF bufferData) { GL.BindBuffer(BufferTarget.ArrayBuffer, buffer.Vbo[0]); GL.BufferSubData(BufferTarget.ArrayBuffer, new IntPtr(0), bufferData.getAtrributeByteSize(0), bufferData.Vertices); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); }
public static void cleanUp(VAO buffer) { GL.DeleteBuffers(buffer.getBuffersCount(), buffer.Vbo); if (buffer.getBufferData().Indices != null) { GL.DeleteBuffers(1, buffer.Ibo); } GL.DeleteVertexArrays(1, buffer.Vao); }
public static void renderBuffers(VAO buffer, PrimitiveType privitiveMode) { GL.BindVertexArray(buffer.Vao[0]); if (buffer.getBufferData().Indices != null) { GL.DrawElements(privitiveMode, buffer.getBufferData().Indices.Length, DrawElementsType.UnsignedInt, 0); } else { GL.DrawArrays(privitiveMode, 0, buffer.getBufferData().getCountVertices()); } GL.BindVertexArray(0); }
public static void genVAO(VAO buffers) { if (buffers.isMapped()) { return; //Проверка ,что генерируем буфферы 1 раз } GL.GenVertexArrays(1, buffers.Vao); // Gen vao GL.GenBuffers(buffers.getBuffersCount(), buffers.Vbo); //Генерируем заданное количество vbo if (buffers.getBufferData().Indices != null) // Gen ibo { GL.GenBuffers(1, buffers.Ibo); } buffers.mapBuffer(); //Устанавливаем флаг, что буфферы сгенерированы }
public static void AddUserVectorAttribute(VAO buffer, Int32 attributeIndex, float[,] value, IntPtr offset, IntPtr size) { Int32 bufferIndex = 0; for (Int32 i = 0; i < (8 + attributeIndex); i++) { if (buffer[i]) { bufferIndex++; } } GL.BindBuffer(BufferTarget.ArrayBuffer, buffer.Vbo[bufferIndex]); GL.BufferSubData(BufferTarget.ArrayBuffer, offset, size, value); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); }
public static void setBufferData(BufferTarget bufferType, VAO buffer) { if (buffer.isDataInserted()) { return; //Проверка что заносим информацию в буфферы 1 раз } byte bufferCount = 0; //***************************************Bind VAO***********************// GL.BindVertexArray(buffer.Vao[0]); // ************************************************ // Bind ibo for indexes // ************************************************ if (buffer.getBufferData().Indices != null) { GL.BindBuffer(BufferTarget.ElementArrayBuffer, buffer.Ibo[0]); //Bind IBO GL.BufferData(BufferTarget.ElementArrayBuffer, buffer.getBufferData().getIndicesByteSize(), buffer.getBufferData().Indices, BufferUsageHint.StaticDraw); } // ************************************************ // Bind vbo for vertices // ************************************************ GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); //Вершины GL.BufferData(bufferType, buffer.getBufferData().getVerticesByteSize(), buffer.getBufferData().Vertices, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(0); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, 0); bufferCount++; // ************************************************ // Bind vbo for normals // ************************************************ if (buffer.getBufferData().Normals != null) { GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); GL.BufferData(bufferType, buffer.getBufferData().getNormalsByteSize(), buffer.getBufferData().Normals, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(1); GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, false, 0, 0); bufferCount++; } // ************************************************ // Bind vbo for texture coordinates // ************************************************ if (buffer.getBufferData().TextureCoordinates != null) { GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); GL.BufferData(bufferType, buffer.getBufferData().getTexCoordByteSize(), buffer.getBufferData().TextureCoordinates, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(2); GL.VertexAttribPointer(2, 2, VertexAttribPointerType.Float, false, 0, 0); bufferCount++; } // ************************************************ // Bind vbo for color values // ************************************************ if (buffer.getBufferData().Color != null) { GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); GL.BufferData(bufferType, buffer.getBufferData().getColorByteSize(), buffer.getBufferData().Color, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(3); GL.VertexAttribPointer(3, 3, VertexAttribPointerType.Float, false, 0, 0); bufferCount++; } // ************************************************ // Bind vbo for tangents // ************************************************ if (buffer.getBufferData().Tangent != null) { GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); GL.BufferData(bufferType, buffer.getBufferData().getTangentByteSize(), buffer.getBufferData().Tangent, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(4); GL.VertexAttribPointer(4, 3, VertexAttribPointerType.Float, false, 0, 0); bufferCount++; } // ************************************************ // Bind vbo for bitangents // ************************************************ if (buffer.getBufferData().Bitangent != null) { GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); GL.BufferData(bufferType, buffer.getBufferData().getBitangentByteSize(), buffer.getBufferData().Bitangent, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(5); GL.VertexAttribPointer(5, 3, VertexAttribPointerType.Float, false, 0, 0); bufferCount++; } // ************************************************ // Bind vbo for userSingleAttributes1 // ************************************************ if (buffer.getBufferData().SingleAttribute1 != null) { GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); GL.BufferData(bufferType, buffer.getBufferData().getSingleAttribute1Size(), buffer.getBufferData().SingleAttribute1, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(6); GL.VertexAttribPointer(6, 1, VertexAttribPointerType.Float, false, 0, 0); GL.VertexAttribDivisor(6, 1); bufferCount++; } // ************************************************ // Bind vbo for userSingleAttributes2 // ************************************************ if (buffer.getBufferData().SingleAttribute2 != null) { GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); GL.BufferData(bufferType, buffer.getBufferData().getSingleAttribute2Size(), buffer.getBufferData().SingleAttribute2, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(7); GL.VertexAttribPointer(7, 1, VertexAttribPointerType.Float, false, 0, 0); GL.VertexAttribDivisor(7, 1); bufferCount++; } // ************************************************ // Bind vbo for userVectorAttributes1 // ************************************************ if (buffer.getBufferData().VecAttribute1 != null) { GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); GL.BufferData(bufferType, buffer.getBufferData().getVectorAttribute1Size(), buffer.getBufferData().VecAttribute1, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(8); GL.VertexAttribPointer(8, 4, VertexAttribPointerType.Float, false, 0, 0); GL.VertexAttribDivisor(8, 1); bufferCount++; } // ************************************************ // Bind vbo for userVectorAttributes2 // ************************************************ if (buffer.getBufferData().VecAttribute2 != null) { GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); GL.BufferData(bufferType, buffer.getBufferData().getVectorAttribute2Size(), buffer.getBufferData().VecAttribute2, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(9); GL.VertexAttribPointer(9, 4, VertexAttribPointerType.Float, false, 0, 0); GL.VertexAttribDivisor(9, 1); bufferCount++; } // ************************************************ // Bind vbo for userVectorAttributes3 // ************************************************ if (buffer.getBufferData().VecAttribute3 != null) { GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); GL.BufferData(bufferType, buffer.getBufferData().getVectorAttribute3Size(), buffer.getBufferData().VecAttribute3, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(10); GL.VertexAttribPointer(10, 4, VertexAttribPointerType.Float, false, 0, 0); GL.VertexAttribDivisor(10, 1); bufferCount++; } // ************************************************ // Bind vbo for userVectorAttributes4 // ************************************************ if (buffer.getBufferData().VecAttribute4 != null) { GL.BindBuffer(bufferType, buffer.Vbo[bufferCount]); GL.BufferData(bufferType, buffer.getBufferData().getVectorAttribute4Size(), buffer.getBufferData().VecAttribute4, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(11); GL.VertexAttribPointer(11, 4, VertexAttribPointerType.Float, false, 0, 0); GL.VertexAttribDivisor(11, 1); bufferCount++; } GL.BindBuffer(BufferTarget.ArrayBuffer, 0); //Отвязываем VBO GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); //Отвязываем IBO GL.BindVertexArray(0); //Отвязываем VAO GL.DisableVertexAttribArray(0); if (buffer.getBufferData().Normals != null) { GL.DisableVertexAttribArray(1); } if (buffer.getBufferData().TextureCoordinates != null) { GL.DisableVertexAttribArray(2); } if (buffer.getBufferData().Color != null) { GL.DisableVertexAttribArray(3); } if (buffer.getBufferData().Tangent != null) { GL.DisableVertexAttribArray(4); } if (buffer.getBufferData().Bitangent != null) { GL.DisableVertexAttribArray(5); } // Data is inserted buffer.dataInserted(); }
public static void renderInstanced(VAO buffer, PrimitiveType primitiveMode, Int32 count) { GL.BindVertexArray(buffer.Vao[0]); GL.DrawArraysInstanced(primitiveMode, 0, buffer.getBufferData().getCountVertices(), count); GL.BindVertexArray(0); }