Esempio n. 1
0
        public void TestDepthFromOtherFrameBuffer()
        {
            Runner.ExecuteAsLoop(_ =>
            {
                FrameBuffer testBuffer = new FrameBuffer(Engine.Renderer.DrawBuffer.Size).WithColor().WithDepth(true);
                var shader             = Engine.AssetLoader.Get <ShaderAsset>("Shaders/DepthTest.xml");

                RenderComposer composer = Engine.Renderer.StartFrame();
                composer.RenderTo(testBuffer);
                composer.ClearFrameBuffer();
                composer.RenderSprite(new Vector3(0, 0, 10), new Vector2(100, 100), Color.Green);
                composer.RenderTo(null);

                composer.SetUseViewMatrix(false);
                composer.SetShader(shader.Shader);
                shader.Shader.SetUniformInt("depthTexture", 1);
                Texture.EnsureBound(testBuffer.DepthTexture.Pointer, 1);
                composer.RenderSprite(new Vector3(0, 0, 0), testBuffer.Texture.Size, Color.White, testBuffer.Texture);
                composer.SetShader();
                composer.SetUseViewMatrix(true);

                composer.RenderSprite(new Vector3(20, 20, 15), new Vector2(100, 100), Color.Blue);
                composer.RenderSprite(new Vector3(10, 10, 0), new Vector2(100, 100), Color.Red);

                Engine.Renderer.EndFrame();
                Runner.VerifyScreenshot(ResultDb.TestDepthFromOtherFrameBuffer);

                testBuffer.Dispose();
            }).WaitOne();
        }
Esempio n. 2
0
        public void ShaderBrokenLoad()
        {
            var shader = Engine.AssetLoader.Get <ShaderAsset>("Shaders/BrokenShader.xml");

            ;

            Runner.ExecuteAsLoop(_ =>
            {
                RenderComposer composer = Engine.Renderer.StartFrame();

                // Set shader.
                composer.SetShader(shader.Shader);

                // Render a blank square.
                composer.RenderSprite(new Vector3(10, 10, 0), new Vector2(10, 10), Color.White);

                // Reset to default shader.
                composer.SetShader();

                Engine.Renderer.EndFrame();
                Runner.VerifyScreenshot(ResultDb.BrokenShader);
            }).WaitOne();

            // Even though the shader is broken, and it doesn't specify a fallback, it should load the compat shader.
            Assert.True(shader.Shader != null);
            Assert.True(shader.IsFallback);

            Engine.AssetLoader.Destroy(shader.Name);
        }
Esempio n. 3
0
        public void ShaderFallback()
        {
            var shader = Engine.AssetLoader.Get <ShaderAsset>("Shaders/BrokenShaderWithFallback.xml");

            ;

            Runner.ExecuteAsLoop(_ =>
            {
                RenderComposer composer = Engine.Renderer.StartFrame();

                // Set shader.
                composer.SetShader(shader.Shader);

                // Render a blank square.
                composer.RenderSprite(new Vector3(10, 10, 0), new Vector2(10, 10), Color.White);

                // Reset to default shader.
                composer.SetShader();

                Engine.Renderer.EndFrame();
                Runner.VerifyScreenshot(ResultDb.ShaderFallback);
            }).WaitOne();

            // The shader should've loaded its fallback.
            Assert.True(shader.Shader != null);
            Assert.True(shader.IsFallback);

            Engine.AssetLoader.Destroy(shader.Name);
        }
Esempio n. 4
0
        public override void Render(RenderComposer composer)
        {
            if (TextureAsset == null)
            {
                return;
            }

            if (BlurIntensity > 0)
            {
                // Apply Blur effect if such is set
                composer.SetShader(BlurShader.Shader);
                BlurShader.Shader.SetUniformFloat("sigma", BlurIntensity);
            }

            Color color = Color.White;

            if (ShadowReverseIntensity < 255)
            {
                // Apply Shadow effect if such is set
                color = new Color(ShadowReverseIntensity, ShadowReverseIntensity, ShadowReverseIntensity); // 180 for a shadowy look
            }

            if (Rotation != 0f)
            {
                // Apply rotation if such is set
                // Tiled rotates images around the bottom left corner
                composer.PushModelMatrix(
                    Matrix4x4.CreateRotationZ(Rotation, new Vector3(X, Y + DisplaySize.Y, 0))
                    );
            }

            // Render
            composer.RenderSprite(
                Position,
                DisplaySize,
                color,
                TextureAsset.Texture,
                TextureArea,
                FlipX
                );

            if (Rotation != 0f)
            {
                // Remove the rotation matrix
                composer.PopModelMatrix();
            }

            if (BlurIntensity > 0)
            {
                // Remove the blur shader
                composer.SetShader(null);
            }
        }
Esempio n. 5
0
        protected override bool RenderInternal(RenderComposer c)
        {
            base.RenderInternal(c);

            RenderState oldState = c.CurrentState.Clone();

            c.SetState(RenderState.Default);
            c.SetUseViewMatrix(false);
            c.RenderSprite(new Vector3(0, 0, 0), Engine.Renderer.CurrentTarget.Size, Color.CornflowerBlue);
            c.SetUseViewMatrix(true);
            c.ClearDepth();

            //c.RenderLine(new Vector3(short.MinValue, 0, 0), new Vector3(short.MaxValue, 0, 0), Color.Red, snapToPixel: false);
            //c.RenderLine(new Vector3(0, short.MinValue, 0), new Vector3(0, short.MaxValue, 0), Color.Green, snapToPixel: false);
            //c.RenderLine(new Vector3(0, 0, short.MinValue), new Vector3(0, 0, short.MaxValue), Color.Blue, snapToPixel: false);

            c.RenderLine(new Vector3(0, 0, 0), new Vector3(short.MaxValue, 0, 0), Color.Red, snapToPixel: false);
            c.RenderLine(new Vector3(0, 0, 0), new Vector3(0, short.MaxValue, 0), Color.Green, snapToPixel: false);
            c.RenderLine(new Vector3(0, 0, 0), new Vector3(0, 0, short.MaxValue), Color.Blue, snapToPixel: false);

            if (_showTerrain)
            {
                _terrain.Render(c);
            }

            if (DisplayObject.Entity?.AnimationRig != null)
            {
                c.SetShader(_skeletalShader.Shader);
                DisplayObject.RenderAnimated(c, _boneVerticesStream);
                c.SetShader();
            }
            else
            {
                DisplayObject.Render(c);
            }

            c.SetState(oldState);

            _boneVerticesStream?.DoTasks(c);

            return(true);
        }
Esempio n. 6
0
        public void ShaderLoadAndDraw()
        {
            var shaders = new List <ShaderAsset>();

            // Which phase of the test is happening. Done to split the draw function.
            var shaderTest = 0;

            shaders.Add(Engine.AssetLoader.Get <ShaderAsset>("Shaders/TestShader.xml"));
            shaders.Add(Engine.AssetLoader.Get <ShaderAsset>("Shaders/TestShaderFragOnly.xml"));
            shaders.Add(Engine.AssetLoader.Get <ShaderAsset>("Shaders/TestShaderVertOnly.xml"));

            void Draw(string resultId)
            {
                Runner.ExecuteAsLoop(_ =>
                {
                    RenderComposer composer = Engine.Renderer.StartFrame();

                    // Set shader.
                    if (shaderTest != 0)
                    {
                        composer.SetShader(shaders[shaderTest - 1].Shader);
                    }

                    // Render a blank square.
                    composer.RenderSprite(new Vector3(10, 10, 0), new Vector2(10, 10), Color.White);

                    // Reset to default shader.
                    composer.SetShader();

                    Engine.Renderer.EndFrame();
                    Runner.VerifyScreenshot(resultId);
                }).WaitOne();
            }

            // Ensure all shaders are loaded.
            foreach (ShaderAsset s in shaders)
            {
                Assert.True(s.Shader != null);
                Assert.False(s.IsFallback);
            }

            // Change to phase 1. This is drawing with the test shader.
            Draw(ResultDb.ShaderTest0);
            shaderTest = 1;
            Draw(ResultDb.ShaderTest1);
            // Change to phase 2. This is drawing with the vert missing shader.
            shaderTest = 2;
            Draw(ResultDb.ShaderTest2);
            // Change to phase 3. This is drawing with the frag missing shader.
            shaderTest = 3;
            Draw(ResultDb.ShaderTest3);

            // Cleanup
            foreach (ShaderAsset s in shaders)
            {
                Engine.AssetLoader.Destroy(s.Name);
            }

            // Ensure the shaders are unloaded.
            Assert.Equal(shaders.Count, shaders.Select(x => x.Name).Except(Engine.AssetLoader.LoadedAssets.Select(x => x.Name)).Count());
        }