public void Draw(ShaderController shader) { if (!IsVisible) return; var useTextures = Vector3.Zero; var useTexture = ProgramCore.MainForm.ctrlRenderControl.UseTexture; GL.ActiveTexture(TextureUnit.Texture1); GL.BindTexture(TextureTarget.Texture2D, Material.TransparentTexture); shader.UpdateUniform("u_TransparentMap", 1); useTextures.Y = Material.TransparentTexture; //shader.UpdateUniform("u_UseTransparent", (float)Material.TransparentTexture); GL.ActiveTexture(TextureUnit.Texture0); GL.BindTexture(TextureTarget.Texture2D, Material.Texture); shader.UpdateUniform("u_Texture", 0); if (useTexture) // заказ старичка. что типа проги не отрабатывают текстуры (которые 3д печать) и надо со всего убрать { shader.UpdateUniform("u_Color", Material.DiffuseColor); useTextures.X = Material.Texture; } //shader.UpdateUniform("u_UseTexture", useTexture ? (float)Material.Texture : 0); shader.UpdateUniform("u_UseTexture", useTextures); GL.EnableClientState(ArrayCap.VertexArray); GL.EnableClientState(ArrayCap.NormalArray); GL.EnableClientState(ArrayCap.TextureCoordArray); GL.EnableClientState(ArrayCap.ColorArray); GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBuffer); GL.BindBuffer(BufferTarget.ElementArrayBuffer, IndexBuffer); GL.VertexPointer(3, VertexPointerType.Float, Vertex.Stride, new IntPtr(0)); GL.NormalPointer(NormalPointerType.Float, Vertex.Stride, new IntPtr(Vector3.SizeInBytes)); GL.TexCoordPointer(2, TexCoordPointerType.Float, Vertex.Stride, new IntPtr(2 * Vector3.SizeInBytes)); GL.ColorPointer(4, ColorPointerType.Float, Vertex.Stride, new IntPtr(2 * Vector3.SizeInBytes + Vector2.SizeInBytes)); GL.DrawRangeElements(PrimitiveType.Triangles, 0, NumIndices, NumIndices, DrawElementsType.UnsignedInt, new IntPtr(0)); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); GL.DisableClientState(ArrayCap.VertexArray); GL.DisableClientState(ArrayCap.NormalArray); GL.DisableClientState(ArrayCap.TextureCoordArray); GL.DisableClientState(ArrayCap.ColorArray); }
/// <summary> Initialize control and setup GL settings </summary> public void Initialize() { loaded = true; PlayAnimation = false; pickingController = new PickingController(camera); idleShader = new ShaderController("idle.vs", "idle.fs"); idleShader.SetUniformLocation("u_UseTexture"); idleShader.SetUniformLocation("u_Color"); idleShader.SetUniformLocation("u_Texture"); idleShader.SetUniformLocation("u_BrushMap"); idleShader.SetUniformLocation("u_TransparentMap"); idleShader.SetUniformLocation("u_World"); idleShader.SetUniformLocation("u_WorldView"); idleShader.SetUniformLocation("u_ViewProjection"); idleShader.SetUniformLocation("u_LightDirection"); blendShader = new ShaderController(ProgramCore.PluginMode ? "blendingPl.vs" : "blending.vs", "blending.fs"); blendShader.SetUniformLocation("u_Texture"); blendShader.SetUniformLocation("u_BlendStartDepth"); blendShader.SetUniformLocation("u_BlendDepth"); brushShader = new ShaderController("brush.vs", "brush.fs"); brushShader.SetUniformLocation("u_Texture"); brushShader.SetUniformLocation("u_World"); brushShader.SetUniformLocation("u_BrushColor"); brushShader.SetUniformLocation("u_SphereCenter"); brushShader.SetUniformLocation("u_SphereRadius"); SetupViewport(glControl); windowInfo = Utilities.CreateWindowsWindowInfo(renderPanel.Handle); graphicsContext = new GraphicsContext(GraphicsMode.Default, windowInfo); renderPanel.Resize += (sender, args) => graphicsContext.Update(windowInfo); glControl.Context.MakeCurrent(glControl.WindowInfo); InitializeProfileSprites(); InitializeCustomBaseSprites(); }
public bool DrawToBrushTexture(ShaderController shader, int oldTextureId, int textureId) { GL.BindTexture(TextureTarget.Texture2D, oldTextureId); DrawQuad(1f, 1f, 1f, 1f); shader.Begin(); GL.ActiveTexture(TextureUnit.Texture0); GL.BindTexture(TextureTarget.Texture2D, oldTextureId); shader.UpdateUniform("u_Texture", 0); shader.UpdateUniform("u_World", Matrix4.Identity); shader.UpdateUniform("u_BrushColor", brushTool.Color); shader.UpdateUniform("u_SphereCenter", brushTool.SphereCenter); shader.UpdateUniform("u_SphereRadius", brushTool.Radius); headMeshesController.RenderMesh.DrawToTexture(headMeshesController.RenderMesh.Parts.Where(p => p.Texture == textureId)); shader.End(); return true; }
private bool DrawToTexture(ShaderController shader, int oldTextureId, int textureId) { //GL.BindTexture(TextureTarget.Texture2D, oldTextureId); DrawQuad(ProgramCore.Project.FaceColor.X, ProgramCore.Project.FaceColor.Y, ProgramCore.Project.FaceColor.Z, 1f); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); GL.Enable(EnableCap.Blend); shader.Begin(); GL.ActiveTexture(TextureUnit.Texture0); GL.BindTexture(TextureTarget.Texture2D, HeadTextureId); shader.UpdateUniform("u_Texture", 0); shader.UpdateUniform("u_BlendStartDepth", -0.5f); shader.UpdateUniform("u_BlendDepth", 4f); headMeshesController.RenderMesh.DrawToTexture(headMeshesController.RenderMesh.Parts.Where(p => p.Texture == textureId)); shader.End(); GL.Disable(EnableCap.Blend); return true; }
private void DrawMeshes(IEnumerable<BaseRenderMesh> meshes, ref ShaderController shader, bool transparent) { foreach (var mesh in meshes) { if (mesh.Material.IsTransparent != transparent) continue; var worldMatrix = mesh.Transform;//Если мы в режиме просмотра морфинга, то делаем это if (InStageMode) { var position = new Vector3(worldMatrix[3, 0], worldMatrix[3, 1], worldMatrix[3, 2]); worldMatrix[3, 0] = 0.0f; worldMatrix[3, 1] = 0.0f; worldMatrix[3, 2] = 0.0f; worldMatrix *= Matrix4.CreateScale(headMeshesController.RenderMesh.RealScale); worldMatrix[3, 0] = position.X * headMeshesController.RenderMesh.RealScale; worldMatrix[3, 1] = position.Y * headMeshesController.RenderMesh.RealScale; worldMatrix[3, 2] = position.Z * headMeshesController.RenderMesh.RealScale; } shader.UpdateUniform("u_World", worldMatrix); shader.UpdateUniform("u_WorldView", worldMatrix * camera.ViewMatrix); shader.UpdateUniform("u_ViewProjection", camera.ViewMatrix * camera.ProjectMatrix); mesh.Draw(shader); } }
public Bitmap RenderToTexture(int oldTextureId, int textureId, int textureWidth, int textureHeight, ShaderController shader, Func<ShaderController, int, int, bool> renderFunc, bool useAlpha = false) { graphicsContext.MakeCurrent(windowInfo); renderPanel.Size = new Size(textureWidth, textureHeight); GL.Viewport(0, 0, textureWidth, textureHeight); GL.ClearColor(0.0f, 0.0f, 0.0f, 0.0f); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.MatrixMode(MatrixMode.Projection); GL.PushMatrix(); GL.LoadIdentity(); GL.MatrixMode(MatrixMode.Modelview); GL.LoadIdentity(); GL.Enable(EnableCap.Texture2D); GL.DepthMask(false); renderFunc(shader, oldTextureId, textureId); GL.DepthMask(true); GL.BindTexture(TextureTarget.Texture2D, 0); GL.MatrixMode(MatrixMode.Projection); GL.PopMatrix(); var result = GrabScreenshot(String.Empty, textureWidth, textureHeight, useAlpha); glControl.Context.MakeCurrent(glControl.WindowInfo); SetupViewport(glControl); return result; }