public void Render(Matrix4 view) { shader = Runtime.shaders["MBN"]; GL.UseProgram(shader.programID); GL.Uniform1(shader.getAttribute("renderVertColor"), Runtime.renderVertColor ? 1 : 0); GL.Uniform1(shader.getAttribute("renderType"), 0);//(int)Runtime.renderType GL.Uniform1(shader.getAttribute("selectedBoneIndex"), Runtime.selectedBoneIndex); GL.UniformMatrix4(shader.getAttribute("modelview"), false, ref view); GL.Uniform3(shader.getAttribute("difLightColor"), Lights.diffuseLight.difR, Lights.diffuseLight.difG, Lights.diffuseLight.difB); GL.Uniform3(shader.getAttribute("ambLightColor"), Lights.diffuseLight.ambR, Lights.diffuseLight.ambG, Lights.diffuseLight.ambB); GL.ActiveTexture(TextureUnit.Texture10); GL.BindTexture(TextureTarget.Texture2D, RenderTools.UVTestPattern); GL.Uniform1(shader.getAttribute("UVTestPattern"), 10); Matrix4[] f = skeleton.getShaderMatrix(); int maxUniformBlockSize = GL.GetInteger(GetPName.MaxUniformBlockSize); int boneCount = skeleton.bones.Count; int dataSize = boneCount * Vector4.SizeInBytes * 4; GL.BindBuffer(BufferTarget.UniformBuffer, vbo_bone); GL.BufferData(BufferTarget.UniformBuffer, (IntPtr)(dataSize), IntPtr.Zero, BufferUsageHint.DynamicDraw); GL.BindBuffer(BufferTarget.UniformBuffer, 0); var blockIndex = GL.GetUniformBlockIndex(shader.programID, "bones"); GL.BindBufferBase(BufferRangeTarget.UniformBuffer, blockIndex, vbo_bone); if (f.Length > 0) { GL.BindBuffer(BufferTarget.UniformBuffer, vbo_bone); GL.BufferSubData(BufferTarget.UniformBuffer, IntPtr.Zero, (IntPtr)(f.Length * Vector4.SizeInBytes * 4), f); } shader.enableAttrib(); GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_vert); GL.BufferData <Vertex>(BufferTarget.ArrayBuffer, (IntPtr)(Vertex.Stride * Vertices.Length), Vertices, BufferUsageHint.StaticDraw); GL.VertexAttribPointer(shader.getAttribute("pos"), 3, VertexAttribPointerType.Float, false, Vertex.Stride, 0); GL.VertexAttribPointer(shader.getAttribute("nrm"), 3, VertexAttribPointerType.Float, false, Vertex.Stride, 12); GL.VertexAttribPointer(shader.getAttribute("col"), 4, VertexAttribPointerType.Float, false, Vertex.Stride, 24); GL.VertexAttribPointer(shader.getAttribute("tx0"), 2, VertexAttribPointerType.Float, false, Vertex.Stride, 40); GL.VertexAttribPointer(shader.getAttribute("bone"), 2, VertexAttribPointerType.Float, false, Vertex.Stride, 48); GL.VertexAttribPointer(shader.getAttribute("weight"), 2, VertexAttribPointerType.Float, false, Vertex.Stride, 56); GL.PointSize(4f); //GL.DrawArrays(PrimitiveType.Points, 0, Vertices.Length); foreach (BCH_Mesh m in Nodes) { GL.Uniform4(shader.getAttribute("colorSamplerUV"), new Vector4(1, 1, 0, 0)); GL.ActiveTexture(TextureUnit.Texture0); BCH_Material material = (BCH_Material)((BCH)Parent.Parent).Materials.Nodes[m.MaterialIndex]; BCH_Texture tex = ((BCH)Parent.Parent).GetTexture(material.Text); GL.BindTexture(TextureTarget.Texture2D, tex == null ? VBNViewport.defaulttex : tex.display); GL.Uniform1(shader.getAttribute("tex"), 0); if (!m.Checked) { continue; } foreach (BCH_PolyGroup pg in m.Nodes) { GL.Uniform1(shader.getAttribute("boneList"), pg.BoneList.Length, pg.BoneList); GL.Disable(EnableCap.CullFace); GL.CullFace(CullFaceMode.Back); GL.BindBuffer(BufferTarget.ElementArrayBuffer, ibo_faces); GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(pg.Faces.Length * sizeof(int)), pg.Faces, BufferUsageHint.StaticDraw); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.DrawElements(PrimitiveType.Triangles, pg.Faces.Length, DrawElementsType.UnsignedInt, 0); } } shader.disableAttrib(); }
public void Render(Matrix4 view) { if (vertices == null) { return; } bool buffersWereInitialized = vertVbo != 0 && boneVbo != 0 && facesIbo != 0; if (!buffersWereInitialized) { GenerateBuffers(); } shader = OpenTKSharedResources.shaders["Mbn"]; shader.UseProgram(); GL.Uniform1(shader.GetVertexAttributeUniformLocation("renderVertColor"), Runtime.renderVertColor ? 1 : 0); GL.Uniform1(shader.GetVertexAttributeUniformLocation("renderType"), (int)Runtime.renderType); GL.Uniform1(shader.GetVertexAttributeUniformLocation("selectedBoneIndex"), Runtime.selectedBoneIndex); GL.UniformMatrix4(shader.GetVertexAttributeUniformLocation("modelview"), false, ref view); GL.Uniform3(shader.GetVertexAttributeUniformLocation("difLightColor"), Runtime.lightSetParam.characterDiffuse.diffuseColor.R, Runtime.lightSetParam.characterDiffuse.diffuseColor.G, Runtime.lightSetParam.characterDiffuse.diffuseColor.B); GL.Uniform3(shader.GetVertexAttributeUniformLocation("ambLightColor"), Runtime.lightSetParam.characterDiffuse.ambientColor.R, Runtime.lightSetParam.characterDiffuse.ambientColor.G, Runtime.lightSetParam.characterDiffuse.ambientColor.B); GL.ActiveTexture(TextureUnit.Texture10); RenderTools.uvTestPattern.Bind(); GL.Uniform1(shader.GetVertexAttributeUniformLocation("UVTestPattern"), 10); Matrix4[] f = skeleton.getShaderMatrix(); int maxUniformBlockSize = GL.GetInteger(GetPName.MaxUniformBlockSize); int boneCount = skeleton.bones.Count; int dataSize = boneCount * Vector4.SizeInBytes * 4; GL.BindBuffer(BufferTarget.UniformBuffer, boneVbo); GL.BufferData(BufferTarget.UniformBuffer, (IntPtr)(dataSize), IntPtr.Zero, BufferUsageHint.DynamicDraw); GL.BindBuffer(BufferTarget.UniformBuffer, 0); var blockIndex = GL.GetUniformBlockIndex(shader.Id, "bones"); GL.BindBufferBase(BufferRangeTarget.UniformBuffer, blockIndex, boneVbo); if (f.Length > 0) { GL.BindBuffer(BufferTarget.UniformBuffer, boneVbo); GL.BufferSubData(BufferTarget.UniformBuffer, IntPtr.Zero, (IntPtr)(f.Length * Vector4.SizeInBytes * 4), f); } shader.EnableVertexAttributes(); GL.BindBuffer(BufferTarget.ArrayBuffer, vertVbo); GL.BufferData <Vertex>(BufferTarget.ArrayBuffer, (IntPtr)(Vertex.sizeInBytes * vertices.Length), vertices, BufferUsageHint.StaticDraw); GL.VertexAttribPointer(shader.GetVertexAttributeUniformLocation("pos"), 3, VertexAttribPointerType.Float, false, Vertex.sizeInBytes, 0); GL.VertexAttribPointer(shader.GetVertexAttributeUniformLocation("nrm"), 3, VertexAttribPointerType.Float, false, Vertex.sizeInBytes, 12); GL.VertexAttribPointer(shader.GetVertexAttributeUniformLocation("col"), 4, VertexAttribPointerType.Float, false, Vertex.sizeInBytes, 24); GL.VertexAttribPointer(shader.GetVertexAttributeUniformLocation("tx0"), 2, VertexAttribPointerType.Float, false, Vertex.sizeInBytes, 40); GL.VertexAttribPointer(shader.GetVertexAttributeUniformLocation("bone"), 2, VertexAttribPointerType.Float, false, Vertex.sizeInBytes, 48); GL.VertexAttribPointer(shader.GetVertexAttributeUniformLocation("weight"), 2, VertexAttribPointerType.Float, false, Vertex.sizeInBytes, 56); GL.PointSize(4f); foreach (BCH_Mesh m in Nodes) { GL.Uniform4(shader.GetVertexAttributeUniformLocation("colorSamplerUV"), new Vector4(1, 1, 0, 0)); GL.ActiveTexture(TextureUnit.Texture0); BCH_Material material = (BCH_Material)((BCH)Parent.Parent).Materials.Nodes[m.MaterialIndex]; BCH_Texture tex = ((BCH)Parent.Parent).GetTexture(material.Text); GL.BindTexture(TextureTarget.Texture2D, tex == null ? RenderTools.defaultTex.Id : tex.display); GL.Uniform1(shader.GetVertexAttributeUniformLocation("tex"), 0); if (!m.Checked) { continue; } foreach (BCH_PolyGroup pg in m.Nodes) { GL.Uniform1(shader.GetVertexAttributeUniformLocation("boneList"), pg.BoneList.Length, pg.BoneList); GL.Disable(EnableCap.CullFace); GL.CullFace(CullFaceMode.Back); GL.BindBuffer(BufferTarget.ElementArrayBuffer, facesIbo); GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(pg.Faces.Length * sizeof(int)), pg.Faces, BufferUsageHint.StaticDraw); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.DrawElements(PrimitiveType.Triangles, pg.Faces.Length, DrawElementsType.UnsignedInt, 0); } } shader.DisableVertexAttributes(); }