/// <summary> Called by render list and executes the operation </summary> public override void Execute(GLMatrixCalc c) { GLTransformFeedback.End(); for (int i = 0; i < TransformFeedbackOperation.VaryingBuffers.Length; i++) { //System.Diagnostics.Debug.WriteLine($"TF {TransformFeedbackOperation.Id} bp {i}"); GLBuffer.UnbindTransformFeedback(i, TransformFeedbackOperation.Id); } GLStatics.Check(); GLTransformFeedback.UnBind(); GLStatics.Check(); }
/// <summary> Called by render list and executes the operation </summary> public override void Execute(GLMatrixCalc c) { TransformFeedback.Bind(); // bind this transformfeedback to target transform feedback GLStatics.Check(); // bind these buffer at offset/set and binding index starting at 0 for (int i = 0; i < VaryingBuffers.Length; i++) { //System.Diagnostics.Debug.WriteLine($"TF {TransformFeedback.Id} bp {i} to buf {VaryingBuffers[i].Id}"); VaryingBuffers[i].BindTransformFeedback(i, TransformFeedback.Id, Offsets == null ? 0 : Offsets[i], Sizes == null ? 0 : Sizes[i]); } GLStatics.Check(); GLTransformFeedback.Begin(PrimitiveType); // and start GLStatics.Check(); }
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 GLColorShaderWorld(), "COSW"); var vs = new GLPLVertexShaderColorModelObjectTranslation(new string[] { "modelpos" }, TransformFeedbackMode.InterleavedAttribs); var fs = new GLPLFragmentShaderVSColor(); var cosot = new GLShaderPipeline(vs, fs); items.Add(cosot, "COSOT"); tfobj = new GLTransformFeedback(); items.Add(tfobj); varyingbuffer = new GLBuffer(10000, true, BufferUsageHint.DynamicCopy); ts1 = new GLOperationQueryTimeStamp(); ts2 = new GLOperationQueryTimeStamp(); rObjects.Add(ts1); #region coloured lines GLRenderState def = new GLRenderState() { DepthTest = true }; // set up default state for fixed values - no depth test, rely on stencil #region Coloured triangles if (true) { GLRenderState rc = GLRenderState.Tri(def); rc.CullFace = true; var tf = new GLOperationTransformFeedback(TransformFeedbackPrimitiveType.Triangles, tfobj, new GLBuffer[] { varyingbuffer }); rObjects.Add(cosot, tf); // must be in render queue, after shader start shape = GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f); rObjects.Add(cosot, "Tri1", GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, shape, new Color4[] { Color4.Red, Color4.Red, Color4.Red, Color4.Red, Color4.Yellow, Color4.Yellow }, new GLRenderDataTranslationRotation(new Vector3(10, 3, 20)) )); rObjects.Add(cosot, new GLOperationEndTransformFeedback(tf)); // must be in render queue, after shader start } for (int i = 0; i < 1; i++) { GLRenderState lines = GLRenderState.Lines(def, 5); rObjects.Add(items.Shader("COSW"), 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"), 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"), 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"), 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 }) ); } rObjects.Add(ts2); #endregion #endregion #region Matrix Calc Uniform items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // def binding of 0 #endregion }
/// <summary> /// Constructor, sets up transform parameters. /// See <href>https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBeginTransformFeedback.xhtml</href> /// </summary> /// <param name="primitivetype">Primitive type for transform feedback (Points/Lines/Triangles) </param> /// <param name="transformfeedback">The GLTransformfeedback instance, previously created. Created externally as it does not have to be created per render</param> /// <param name="buffers">An array of buffers to receive the transform feedback into, starting at index 0. Must be created and allocated with DynamicCopy. See <href>https://www.khronos.org/opengl/wiki/Transform_Feedback</href> for details on how to use multiple buffers</param> /// <param name="offset">Offset into buffer if size != -1</param> /// <param name="size">Buffer area allocated. If size == -1, all of buffer</param> public GLOperationTransformFeedback(TransformFeedbackPrimitiveType primitivetype, GLTransformFeedback transformfeedback, GLBuffer[] buffers, int[] offset = null, int[] size = null) { this.PrimitiveType = primitivetype; this.TransformFeedback = transformfeedback; this.Id = TransformFeedback.Id; // mirror the ID, we are the same this.VaryingBuffers = buffers; this.Offsets = offset; this.Sizes = size; }