Ejemplo n.º 1
0
        public PrimitivesExample(Renderer renderer)
        {
            // Create the shaders
            Fe.Shader vertexShader, fragmentShader;
            switch (renderer.GetRendererType())
            {
            case Fe.RendererType.OpenGL:
                vertexShader   = new Fe.Shader(Fe.ShaderType.Vertex, File.ReadAllText("default.vert"));
                fragmentShader = new Fe.Shader(Fe.ShaderType.Fragment, File.ReadAllText("default.frag"));
                break;

            default:
                throw new System.Exception("Unknown backend renderer type");
            }

            vs = vertexShader;
            fs = fragmentShader;

            program = new ShaderProgram(vs, fs);

            // Vertices that make up a cube.
            PosColorVertex[] vertices =
            {
                new PosColorVertex()
                {
                    x = 0, y = 0, z = 0
                },
                new PosColorVertex()
                {
                    x = 0, y = 1, z = 0
                },
                new PosColorVertex()
                {
                    x = 1, y = 0, z = 0
                },
                new PosColorVertex()
                {
                    x = 1, y = 1, z = 0
                },
            };

            // Create vertex buffer for our cube
            this._vb = new Fe.VertexBuffer <PosColorVertex>(vertices);

            Fe.Uniform colourUniform = new Fe.Uniform("colour", Fe.UniformType.Uniform4f);
            defaultUniforms = new Fe.UniformBuffer();
            defaultUniforms.Set(colourUniform, 1.0f, 1.0f, 1.0f, 1.0f);
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            var canvas = new ExampleBase.GraphicsCanvas();

            // Create the renderer
            var renderer = new Fe.Renderer();

            // Set the handle from our form so we let Fe create context/devices as appropriate.
            renderer.SetWindowHandle(canvas.Handle);

            // Initialise the renderer
            renderer.Init();

            // Create geometry layer command bucker
            var geometryBucket = renderer.AddCommandBucket(UInt16.MaxValue);

            // Create the shaders
            Fe.Shader vertexShader, fragmentShader;
            switch (renderer.GetRendererType())
            {
            case Fe.RendererType.OpenGL:
                vertexShader   = new Fe.Shader(Fe.ShaderType.Vertex, File.ReadAllText("default.vert"));
                fragmentShader = new Fe.Shader(Fe.ShaderType.Fragment, File.ReadAllText("default.frag"));
                break;

            default:
                throw new Exception("Unknown backend renderer type");
            }

            Fe.ShaderProgram program = new ShaderProgram(vertexShader, fragmentShader);

            // Build plane data
            var plane = new Fe.Extra.Geometry.Plane(30, 30, 30, 30);

            PosColorVertex[] vertices = new PosColorVertex[plane.Vertices.Length / 3];

            Random rand   = new Random();
            int    i      = 0;
            int    offset = 0;

            for (i = 0; i < vertices.Length; i++)
            {
                vertices[i].x    = plane.Vertices[offset];
                vertices[i].y    = plane.Vertices[offset + 1];
                vertices[i].z    = plane.Vertices[offset + 2];
                vertices[i].abgr = (uint)(rand.Next(1 << 30)) << 2 | (uint)(rand.Next(1 << 2));;

                offset += 3;
            }

            // Create vertex buffer for our cube
            var vb = new Fe.VertexBuffer <PosColorVertex>(vertices, true);
            var ib = new Fe.IndexBuffer(plane.Indices);

            // Create shared uniforms
            Fe.Uniform projectionUniform = new Fe.Uniform("projectionMatrix", Fe.UniformType.Matrix4x4f);

            Fe.UniformBuffer sharedUniforms = new Fe.UniformBuffer();

            // Turn off face culling.
            var rs = new RasteriserState(CullMode.None);

            Stopwatch frameTimer = Stopwatch.StartNew();
            double    frameTime  = 0;
            float     rotTime    = 0.0f;
            float     waveyTime  = 0.0f;

            canvas.Title = "Dynamic vertex buffer update example";

            void Resize(int width, int height)
            {
                // Set up a projection matrix
                var projectionMatrix = Nml.Matrix4x4.PerspectiveProjectionRH(Nml.Common.Pi / 4, (float)width / (float)height, 0.1f, 100.0f);

                projectionMatrix *= Nml.Matrix4x4.Translate(0, 0, -50.0f);
                sharedUniforms.Set(projectionUniform, projectionMatrix.ToArray());

                renderer.Reset(width, height);
            }

            // Force an Initial resize, you could handle this with some event on your window if you wanted.
            Resize(canvas.Width, canvas.Height);

            void Cleanup()
            {
                // Kill off the renderer and clean up all underlying resources.
                renderer.Dispose();
            }

            void Update()
            {
                frameTime = frameTimer.Elapsed.TotalMilliseconds;
                frameTimer.Restart();

                // Increase the animation
                rotTime   += (float)frameTime * 0.0010f;
                waveyTime += (float)frameTime * 0.01f;

                var cubeCommand = geometryBucket.AddCommand(1);

                cubeCommand.SetShaderProgram(program);
                cubeCommand.SetVertexBuffer(vb);
                cubeCommand.SetIndexBuffer(ib);
                cubeCommand.SetSharedUniforms(sharedUniforms);
                cubeCommand.SetRasteriserState(rs);

                // Generate new vertice positionsd
                for (i = 0; i < vertices.Length; i++)
                {
                    float newPos = (float)Math.Sin(waveyTime + i) * 1.5f;
                    vertices[i].z = newPos;
                }

                // Update the buffer
                vb.SetData(vertices);

                Nml.Matrix4x4 planeTransform = Nml.Matrix4x4.Identity;
                // Rotate it to make look pretty
                Nml.Quaternion rotQuat;
                Nml.Quaternion.RotateEuler(0, rotTime * 0.37f, rotTime * 0.13f, out rotQuat);
                Nml.Quaternion.GetMatrix4x4(ref rotQuat, out planeTransform);

                cubeCommand.SetTransform(planeTransform.ToArray());

                // Submit current commands queued to the renderer for rendering.
                renderer.EndFrame();
            }

            canvas.Resize += () =>
            {
                Resize(canvas.Width, canvas.Height);
            };

            canvas.Closing += () =>
            {
                Cleanup();
            };

            ExampleBase.Application.Run(canvas, () =>
            {
                Update();
            });
        }
Ejemplo n.º 3
0
        public TranslucencySortExample(Renderer renderer)
        {
            // Create the shaders
            Fe.Shader vertexShader, fragmentShader;
            switch (renderer.GetRendererType())
            {
            case Fe.RendererType.OpenGL:
                vertexShader   = new Fe.Shader(Fe.ShaderType.Vertex, File.ReadAllText("default.vert"));
                fragmentShader = new Fe.Shader(Fe.ShaderType.Fragment, File.ReadAllText("default.frag"));
                break;

            default:
                throw new System.Exception("Unknown backend renderer type");
            }

            vs = vertexShader;
            fs = fragmentShader;

            program = new ShaderProgram(vs, fs);

            // BlendState for alpha transparency.
            this._bs = new Fe.BlendState(true,
                                         Fe.BlendFactor.SourceAlpha,
                                         Fe.BlendFactor.InvertSourceAlpha,
                                         Fe.BlendOperation.Add,
                                         Fe.BlendFactor.One,
                                         Fe.BlendFactor.Zero,
                                         Fe.BlendOperation.Add);

            // Vertices that make up a cube.
            PosColorVertex[] vertices =
            {
                new PosColorVertex(-0.25f,  0.25f,  0.25f, 0xbbFF0000),
                new PosColorVertex(0.25f,   0.25f,  0.25f, 0xbbFF0000),
                new PosColorVertex(-0.25f, -0.25f,  0.25f, 0xbbFF0000),
                new PosColorVertex(0.25f,  -0.25f,  0.25f, 0xbbFF0000),
                new PosColorVertex(-0.25f,  0.25f, -0.25f, 0xbbFF0000),
                new PosColorVertex(0.25f,   0.25f, -0.25f, 0xbbFF0000),
                new PosColorVertex(-0.25f, -0.25f, -0.25f, 0xbbFF0000),
                new PosColorVertex(0.25f,  -0.25f, -0.25f, 0xbbFF0000),
            };

            // Indices that make up a cube.
            uint[] indexPositions =
            {
                0, 1, 2,
                1, 3, 2,
                4, 6, 5,
                5, 6, 7,
                0, 2, 4,
                4, 2, 6,
                1, 5, 3,
                5, 7, 3,
                0, 4, 1,
                4, 5, 1,
                2, 3, 6,
                6, 3, 7,
            };

            // Create vertex buffer for our cube
            this._vb = new Fe.VertexBuffer <PosColorVertex>(vertices);
            this._ib = new Fe.IndexBuffer(indexPositions);

            Fe.Uniform colourUniform = new Fe.Uniform("colour", Fe.UniformType.Uniform4f);
            _opaque = new Fe.UniformBuffer();
            _opaque.Set(colourUniform, 0.0f, 1.0f, 0.0f, 1.0f);

            _translucent = new Fe.UniformBuffer();
            _translucent.Set(colourUniform, 1.0f, 0.0f, 0.0f, 0.4f);
        }