private new void Add(IGLProgramShader prog, IGLRenderableItem r, bool atend = false) { System.Diagnostics.Debug.Assert(false, "Cannot add a normal shader to a compute shader list"); }
private string EnsureName(string name, IGLProgramShader prog, IGLRenderableItem r) { return(name.HasChars() ? name : (prog.GetType().Name + ":" + r.GetType().Name + " # " + (unnamed++).ToStringInvariant())); }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 1f; gl3dcontroller.MatrixCalc.PerspectiveFarZDistance = 1000f; gl3dcontroller.ZoomDistance = 20F; gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(110f, 0, 0f), 1F); gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms / 100.0f); }; items.Add(new GLTexturedShaderObjectTranslation(), "TEXOT"); items.Add(new GLTexturedShaderObjectTranslation(), "TEXOTNoRot"); items.Add(new GLColorShaderWorld(), "COSW"); items.Add(new GLColorShaderObjectTranslation(), "COSOT"); items.Add(new GLFixedColorShaderObjectTranslation(Color.Goldenrod), "FCOSOT"); items.Add(new GLTexturedShaderObjectCommonTranslation(), "TEXOCT"); items.Add(new GLTexture2D(Properties.Resources.dotted2, SizedInternalFormat.Rgba8), "dotted"); items.Add(new GLTexture2D(Properties.Resources.Logo8bpp, SizedInternalFormat.Rgba8), "logo8bpp"); items.Add(new GLTexture2D(Properties.Resources.wooden, SizedInternalFormat.Rgba8), "wooden"); items.Add(new GLTexture2D(Properties.Resources.shoppinglist, SizedInternalFormat.Rgba8), "shoppinglist"); items.Add(new GLTexture2D(Properties.Resources.golden, SizedInternalFormat.Rgba8), "golden"); items.Add(new GLTexture2D(Properties.Resources.smile5300_256x256x8, SizedInternalFormat.Rgba8), "smile"); items.Add(new GLTexture2D(Properties.Resources.moonmap1k, SizedInternalFormat.Rgba8), "moon"); #region coloured lines GLRenderState def = new GLRenderState() { DepthTest = false }; // set up default state for fixed values - no depth test, rely on stencil if (true) { rObjects.Add(new GLOperationSetStencil()); // set default stencil GLRenderState rq = GLRenderState.Quads(def); IGLProgramShader s = items.Shader("TEXOT"); rObjects.Add(s, "Quad", GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(5.0f, 5.0f, new Vector3(-90F.Radians(), 0, 0)), GLShapeObjectFactory.TexQuadCW, new GLRenderDataTranslationRotationTexture(items.Tex("dotted"), new Vector3(-2, 3, -6)) )); rObjects.Add(new GLOperationStencilOnlyIfEqual()); } #region Coloured triangles if (true) { GLRenderState rc = GLRenderState.Tri(def); rc.CullFace = false; rObjects.Add(items.Shader("COSOT"), "Tri", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f), new Color4[] { Color4.Red, Color4.Green, Color4.Blue, Color4.White, Color4.Cyan, Color4.Orange }, new GLRenderDataTranslationRotation(new Vector3(10, 3, 20)) )); } if (true) { GLRenderState lines = GLRenderState.Lines(def, 5); rObjects.Add(items.Shader("COSW"), "L1", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(-100, -0, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.White, Color.Red, Color.DarkRed, Color.DarkRed }) ); GLRenderState lines2 = GLRenderState.Lines(def, 1); rObjects.Add(items.Shader("COSW"), "L2", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines2, GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(100, -0, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Orange, Color.Blue, Color.DarkRed, Color.DarkRed })); rObjects.Add(items.Shader("COSW"), "L3", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines2, GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(-100, 10, 100), new Vector3(10, 0, 0), 21), new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange }) ); rObjects.Add(items.Shader("COSW"), "L4", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines2, GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(100, 10, -100), new Vector3(0, 0, 10), 21), new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange }) ); } #endregion #endregion #region Matrix Calc Uniform items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // def binding of 0 #endregion }
/// <summary>Execute the render list, given the render state, matrix calc. Optional verbose debug output mode </summary> public void Render(GLRenderState currentstate, GLMatrixCalc c, bool verbose = false) { if (verbose) { System.Diagnostics.Trace.WriteLine("***Begin RList"); } GLStatics.Check(); // ensure clear before start GLRenderState lastapplied = null; IGLProgramShader curshader = null; foreach (var shaderri in renderables) // kvp of Key=Shader, Value = list of renderables { // shader must be enabled if (shaderri.Item1.Enable) { if (shaderri.Item2 == null) // indicating its a compute or operation { if (shaderri.Item1 is GLShaderCompute) // if compute { if (curshader != null) // turn off current shader { curshader.Finish(); curshader = null; } if (verbose) { System.Diagnostics.Trace.WriteLine(" Compute Shader " + shaderri.Item1.GetType().Name); } shaderri.Item1.Start(c); // start/finish it shaderri.Item1.Finish(); } else { if (verbose) { System.Diagnostics.Trace.WriteLine(" Operation " + shaderri.Item1.GetType().Name); } shaderri.Item1.Start(c); // operations just start, but don't change the current shader } } else if (shaderri.Item2.Find(x => x.Item2.Visible) != null) // must have a list, all must not be null, and some must be visible { if (curshader != shaderri.Item1) // if a different shader instance { if (curshader != null) // finish the last one if present { curshader.Finish(); } curshader = shaderri.Item1; curshader.Start(c); // start the program - if compute shader, or operation, this executes the code } //System.Diagnostics.Trace.WriteLine("Shader " + kvp.Item1.GetType().Name); foreach (var g in shaderri.Item2) { GLOFC.GLStatics.Check(); if (g.Item2 != null && g.Item2.Visible) // Make sure its visible and not empty slot { if (verbose) { System.Diagnostics.Trace.WriteLine(" Bind " + g.Item1 + " shader " + shaderri.Item1.GetType().Name); } if (g.Item2.RenderState == null) // if no render control, do not change last applied. { g.Item2.Bind(null, shaderri.Item1, c); } else if (object.ReferenceEquals(g.Item2.RenderState, lastapplied)) // no point forcing the test of rendercontrol if its the same as last applied { g.Item2.Bind(null, shaderri.Item1, c); } else { g.Item2.Bind(currentstate, shaderri.Item1, c); // change and remember lastapplied = g.Item2.RenderState; } if (verbose) { System.Diagnostics.Trace.WriteLine(" Render " + g.Item1 + " shader " + shaderri.Item1.GetType().Name); } g.Item2.Render(); //System.Diagnostics.Trace.WriteLine("....Render Over " + g.Item1); } else { if (verbose) { System.Diagnostics.Trace.WriteLine(" Not visible " + g.Item1 + " " + shaderri.Item1.GetType().Name); } } GLOFC.GLStatics.Check(); } } else { if (verbose) { System.Diagnostics.Trace.WriteLine(" No items visible " + shaderri.Item1.GetType().Name); } } } else { if (verbose) { System.Diagnostics.Trace.WriteLine(" Shader disabled " + shaderri.Item1.GetType().Name + " " + shaderri.Item1.Name); } } } if (curshader != null) { curshader.Finish(); } if (verbose) { System.Diagnostics.Trace.WriteLine("***End RList"); } GL.UseProgram(0); // final clean up GL.BindProgramPipeline(0); }
/// <summary> Add this type with an optional name </summary> public IGLProgramShader Add(IGLProgramShader disp, string name = null) { System.Diagnostics.Debug.Assert(!items.ContainsValue(disp)); items.Add(EnsureName(name), disp); return(disp); }