//Save VAO to gobject public bool saveVAO(ulong hash, GLVao vao) { //Double check tha the VAO is not already in the dictinary if (GLVaos.ContainsKey(hash)) { Console.WriteLine("Vao already in the dictinary, nothing to do..."); return(false); } //Save to dictionary GLVaos[hash] = vao; return(true); }
public void renderBSphere(GLSLHelper.GLSLShaderConfig shader) { for (int i = 0; i < instance_count; i++) { GLVao bsh_Vao = setupBSphere(i); //Rendering GL.UseProgram(shader.program_id); //Step 2 Bind & Render Vao //Render Bounding Sphere GL.BindVertexArray(bsh_Vao.vao_id); GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); GL.DrawElements(PrimitiveType.Triangles, 600, DrawElementsType.UnsignedInt, (IntPtr)0); GL.BindVertexArray(0); bsh_Vao.Dispose(); } }
public GLMeshVao(MeshMetaData data) { vao = new GLVao(); metaData = new MeshMetaData(data); }
//Constructor public GLMeshVao() { vao = new GLVao(); }
public GLVao generateVAO() { GLVao vao = new GLVao(); //Generate VAO vao.vao_id = GL.GenVertexArray(); GL.BindVertexArray(vao.vao_id); //Generate VBOs int[] vbo_buffers = new int[2]; GL.GenBuffers(2, vbo_buffers); vao.vertex_buffer_object = vbo_buffers[0]; vao.element_buffer_object = vbo_buffers[1]; ErrorCode err = GL.GetError(); if (err != ErrorCode.NoError) { Console.WriteLine(GL.GetError()); } //Bind vertex buffer int size; //Upload Vertex Buffer GL.BindBuffer(BufferTarget.ArrayBuffer, vao.vertex_buffer_object); GL.BufferData(BufferTarget.ArrayBuffer, vbuffer.Length, vbuffer, BufferUsageHint.StaticDraw); GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size); if (size != vbuffer.Length) { throw new ApplicationException(String.Format("Problem with vertex buffer")); } //Upload index buffer GL.BindBuffer(BufferTarget.ElementArrayBuffer, vao.element_buffer_object); GL.BufferData(BufferTarget.ElementArrayBuffer, ibuffer.Length, ibuffer, BufferUsageHint.StaticDraw); //Assign VertexAttribPointers for (int i = 0; i < 7; i++) { if (this.bufInfo[i] == null) { continue; } bufInfo buf = this.bufInfo[i]; GL.VertexAttribPointer(i, buf.count, buf.type, false, buf.stride, buf.offset); GL.EnableVertexAttribArray(i); } //Unbind GL.BindVertexArray(0); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); for (int i = 0; i < 7; i++) { GL.DisableVertexAttribArray(i); } return(vao); }
//Fetch main VAO public GLVao generateVAO(Mesh so) { //Generate VAO GLVao vao = new GLVao(); vao.vao_id = GL.GenVertexArray(); GL.BindVertexArray(vao.vao_id); //Generate VBOs int[] vbo_buffers = new int[2]; GL.GenBuffers(2, vbo_buffers); vao.vertex_buffer_object = vbo_buffers[0]; vao.element_buffer_object = vbo_buffers[1]; //Bind vertex buffer int size; GL.BindBuffer(BufferTarget.ArrayBuffer, vao.vertex_buffer_object); //Upload Vertex Buffer GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)meshMetaDataDict[so.metaData.Hash].vs_size, meshDataDict[so.metaData.Hash].vs_buffer, BufferUsageHint.StaticDraw); GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size); if (size != vx_size * (so.metaData.vertrend_graphics + 1)) { //throw new ApplicationException(String.Format("Problem with vertex buffer")); Util.showError("Mesh metadata does not match the vertex buffer size from the geometry file", "Error"); } Common.RenderStats.vertNum += so.metaData.vertrend_graphics + 1; //Accumulate settings //Assign VertexAttribPointers for (int i = 0; i < 7; i++) { if (bufInfo[i] == null) { continue; } bufInfo buf = bufInfo[i]; GL.VertexAttribPointer(i, buf.count, buf.type, buf.normalize, vx_size, buf.offset); GL.EnableVertexAttribArray(i); } //Upload index buffer GL.BindBuffer(BufferTarget.ElementArrayBuffer, vao.element_buffer_object); GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)meshMetaDataDict[so.metaData.Hash].is_size, meshDataDict[so.metaData.Hash].is_buffer, BufferUsageHint.StaticDraw); GL.GetBufferParameter(BufferTarget.ElementArrayBuffer, BufferParameterName.BufferSize, out size); if (size != meshMetaDataDict[so.metaData.Hash].is_size) { Util.showError("Mesh metadata does not match the index buffer size from the geometry file", "Error"); //throw new ApplicationException(String.Format("Problem with vertex buffer")); } RenderStats.trisNum += (int)(so.metaData.batchcount / 3); //Accumulate settings //Unbind GL.BindVertexArray(0); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); for (int i = 0; i < 7; i++) { GL.DisableVertexAttribArray(i); } return(vao); }