示例#1
0
 /// <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();
 }
示例#2
0
        /// <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
        }
示例#4
0
 /// <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;
 }