예제 #1
0
        public bool LoadFromKtx(string path)
        {
            string iblPath = path + "_ibl.ktx";

            if (!File.Exists(iblPath))
            {
                return(false);
            }

            string skyPath = path + "_skybox.ktx";

            if (!File.Exists(skyPath))
            {
                return(false);
            }

            var iblKtx = CreateKtx(iblPath);
            var skyKtx = CreateKtx(skyPath);

            _skyboxTexture = KtxUtility.CreateTexture(_engine, skyKtx, false);
            _texture       = KtxUtility.CreateTexture(_engine, iblKtx, false);

            if (!iblKtx.GetSphericalHarmonics(out _bands))
            {
                return(false);
            }

            IndirectLight = IndirectLightBuilder.Create()
                            .WithReflections(_texture)
                            .WithIntensity(Intensity)
                            .Build(_engine);

            Skybox = SkyboxBuilder.Create()
                     .WithEnvironment(_skyboxTexture)
                     .WithSun(true)
                     .Build(_engine);

            return(true);
        }
예제 #2
0
        static void Main(string[] args)
        {
            VertexBuffer     vertexBuffer     = null;
            IndexBuffer      indexBuffer      = null;
            Material         material         = null;
            MaterialInstance materialInstance = null;
            Texture          splatTexture     = null;
            int    renderable   = -1;
            int    cameraEntity = -1;
            Camera camera       = null;
            Skybox skybox       = null;

            var app = new Application(
                new WindowConfig()
            {
                Title = "point_sprites",
            },
                new ApplicationConfig()
                );

            app.Setup = (engine, view, scene) => {
                splatTexture = CreateSplatTexture(engine);

                Vertex[] kVertices   = new Vertex[NUM_POINTS];
                float[]  kPointSizes = new float[NUM_POINTS];
                ushort[] kIndices    = new ushort[NUM_POINTS];

                var dtheta = MathF.PI * 2 / NUM_POINTS;
                var dsize  = MAX_POINT_SIZE / NUM_POINTS;
                var dcolor = 256.0f / NUM_POINTS;

                byte[]       vbo       = new byte[NUM_POINTS * (8 + 4)];
                MemoryStream vboStream = new MemoryStream(vbo);
                BinaryWriter vboWriter = new BinaryWriter(vboStream);

                for (int i = 0; i < NUM_POINTS; i++)
                {
                    float theta = dtheta * i;
                    uint  c     = (uint)(dcolor * i);
                    kVertices[i].Position.X = MathF.Cos(theta);
                    kVertices[i].Position.Y = MathF.Sin(theta);
                    kVertices[i].Color      = 0xff000000u | c | (c << 8) | (c << 16);
                    kPointSizes[i]          = MIN_POINT_SIZE + dsize * i;
                    kIndices[i]             = (ushort)i;

                    vboWriter.Write(kVertices[i].Position.X);
                    vboWriter.Write(kVertices[i].Position.Y);
                    vboWriter.Write(kVertices[i].Color);
                }

                vertexBuffer = VertexBufferBuilder.Create()
                               .WithVertexCount(NUM_POINTS)
                               .WithBufferCount(2)
                               .WithAttribute(VertexAttribute.Position, 0, ElementType.Float2, 0, Marshal.SizeOf <Vertex>())
                               .WithAttribute(VertexAttribute.Color, 0, ElementType.UByte4, Marshal.SizeOf <Vector2>(), Marshal.SizeOf <Vertex>())
                               .WithNormalized(VertexAttribute.Color)
                               .WithAttribute(VertexAttribute.Custom0, 1, ElementType.Float, 0, Marshal.SizeOf <float>())
                               .Build(engine);
                vertexBuffer.SetBufferAt(engine, 0, vbo);
                vertexBuffer.SetBufferAt(engine, 1, kPointSizes);

                indexBuffer = IndexBufferBuilder.Create()
                              .WithIndexCount(NUM_POINTS)
                              .WithBufferType(IndexType.UShort)
                              .Build(engine);
                indexBuffer.SetBuffer(engine, kIndices);

                var sampleData = new SampleDataLoader();

                material = MaterialBuilder.Create()
                           .WithPackage(sampleData.LoadPointSprites())
                           .Build(engine);

                renderable = EntityManager.Create();

                materialInstance = material.CreateInstance();
                materialInstance.SetParameter("fade", splatTexture, new TextureSampler(SamplerMinFilter.Linear, SamplerMagFilter.Linear));

                RenderableBuilder.Create()
                .WithBoundingBox(
                    new Box(
                        new Vector3(-1, -1, -1),
                        new Vector3(1, 1, 1)
                        )
                    )
                .WithMaterial(0, materialInstance)
                .WithGeometry(0, PrimitiveType.Points, vertexBuffer, indexBuffer, 0, NUM_POINTS)
                .WithCulling(false)
                .WithReceiveShadows(false)
                .WithCastShadows(false)
                .Build(engine, renderable);

                scene.AddEntity(renderable);
                cameraEntity = EntityManager.Create();
                camera       = engine.CreateCamera(cameraEntity);

                view.Camera = camera;

                skybox = SkyboxBuilder.Create()
                         .WithColor(new Color(0.1f, 0.125f, 0.25f, 1.0f))
                         .Build(engine);
                scene.Skybox = skybox;
            };

            app.Animate = (engine, view, now) => {
                var zoom   = 1.5f;
                var width  = view.Viewport.Width;
                var height = view.Viewport.Height;
                var aspect = (float)width / height;

                camera.SetProjection(Projection.Ortho, -aspect * zoom, aspect * zoom, -zoom, zoom, 0, 1);

                var tcm = engine.TransformManager;
                tcm.SetTransform(tcm.GetInstance(renderable), Matrix4x4.CreateFromAxisAngle(Vector3.UnitZ, now));
            };

            app.Cleanup = (engine, view, scene) => {
                engine.Destroy(skybox);
                engine.Destroy(renderable);
                engine.Destroy(materialInstance);
                engine.Destroy(material);
                engine.Destroy(vertexBuffer);
                engine.Destroy(indexBuffer);

                engine.DestroyCameraComponent(cameraEntity);
                EntityManager.Destroy(cameraEntity);
            };

            app.Run();
        }
예제 #3
0
        static void Main(string[] args)
        {
            Skybox       skybox       = null;
            VertexBuffer vertexBuffer = null;
            IndexBuffer  indexBuffer  = null;
            Material     material     = null;
            int          renderable   = -1;
            Camera       camera       = null;
            int          cameraEntity = -1;

            var vbo = new VertexBufferObject();

            vbo.Write(new Vector2(1, 0));
            vbo.Write(0xffff0000u);
            vbo.Write(new Vector2(MathF.Cos(MathF.PI * 2 / 3), MathF.Sin(MathF.PI * 2 / 3)));
            vbo.Write(0xff00ff00u);
            vbo.Write(new Vector2(MathF.Cos(MathF.PI * 4 / 3), MathF.Sin(MathF.PI * 4 / 3)));
            vbo.Write(0xff0000ffu);

            var app = new Application(
                new WindowConfig()
            {
                Title = "hellotriangle",
            },
                new ApplicationConfig()
                );

            app.Setup = (engine, view, scene) => {
                skybox = SkyboxBuilder.Create()
                         .WithColor(new Color(0.1f, 0.125f, 0.25f, 1.0f))
                         .Build(engine);

                scene.Skybox = skybox;
                view.PostProcessingEnabled = false;

                vertexBuffer = VertexBufferBuilder.Create()
                               .WithVertexCount(3)
                               .WithBufferCount(1)
                               .WithAttribute(VertexAttribute.Position, 0, ElementType.Float2, 0, 12)
                               .WithAttribute(VertexAttribute.Color, 0, ElementType.UByte4, 8, 12)
                               .WithNormalized(VertexAttribute.Color)
                               .Build(engine);
                vertexBuffer.SetBufferAt(engine, 0, vbo);

                indexBuffer = IndexBufferBuilder.Create()
                              .WithIndexCount(3)
                              .WithBufferType(IndexType.UShort)
                              .Build(engine);
                indexBuffer.SetBuffer(engine, TRIANGLE_INDICES);

                var sampleData = new SampleDataLoader();

                material = MaterialBuilder.Create()
                           .WithPackage(sampleData.LoadBakedColor())
                           .Build(engine);

                renderable = EntityManager.Create();

                RenderableBuilder.Create()
                .WithBoundingBox(
                    new Box(
                        new Vector3(-1, -1, -1),
                        new Vector3(1, 1, 1)
                        )
                    )
                .WithMaterial(0, material.DefaultInstance)
                .WithGeometry(0, PrimitiveType.Triangles, vertexBuffer, indexBuffer, 0, 3)
                .WithCulling(false)
                .WithReceiveShadows(false)
                .WithCastShadows(false)
                .Build(engine, renderable);

                scene.AddEntity(renderable);

                cameraEntity = EntityManager.Create();
                camera       = engine.CreateCamera(cameraEntity);
                view.Camera  = camera;
            };

            app.Cleanup = (engine, view, scene) => {
                engine.Destroy(skybox);
                engine.Destroy(renderable);
                engine.Destroy(material);
                engine.Destroy(vertexBuffer);
                engine.Destroy(indexBuffer);
                engine.DestroyCameraComponent(cameraEntity);

                EntityManager.Destroy(cameraEntity);
            };

            app.Animate = (engine, view, now) => {
                var ZOOM = 1.5f;
                var w    = view.Viewport.Width;
                var h    = view.Viewport.Height;
                ;
                var aspect = (float)w / h;

                camera.SetProjection(Projection.Ortho, -aspect * ZOOM, aspect * ZOOM, -ZOOM, ZOOM, 0, 1);

                var tcm = engine.TransformManager;
                tcm.SetTransform(tcm.GetInstance(renderable), Matrix4x4.CreateFromAxisAngle(Vector3.UnitZ, now));
            };

            app.Run();
        }
예제 #4
0
        static void Main(string[] args)
        {
            Texture          texture          = null;
            Skybox           skybox           = null;
            VertexBuffer     vertexBuffer     = null;
            IndexBuffer      indexBuffer      = null;
            Material         material         = null;
            MaterialInstance materialInstance = null;
            Camera           camera           = null;
            int cameraEntity = -1;
            int renderable   = -1;

            var app = new Application(
                new WindowConfig()
            {
                Title = "texturedquad"
            },
                new ApplicationConfig()
                );

            app.Setup = (engine, view, scene) => {
                var path = Path.Combine(app.RootAssetPath, "textures/Moss_01/Moss_01_Color.png");

                if (!File.Exists(path))
                {
                    Console.WriteLine("The texture {0} does not exist", path);
                    Environment.Exit(1);
                }

                using (var stream = File.OpenRead(path)) {
                    var imageResult = ImageResult.FromStream(stream, ColorComponents.RedGreenBlueAlpha);
                    Console.WriteLine("Loaded texture: {0}x{1}", imageResult.Width, imageResult.Height);

                    var pixelBuffer = new PixelBufferDescriptor(imageResult.Data, PixelDataFormat.Rgba, PixelDataType.UByte);

                    texture = TextureBuilder.Create()
                              .WithWidth(imageResult.Width)
                              .WithHeight(imageResult.Height)
                              .WithLevels(1)
                              .WithSampler(TextureSamplerType.Texture2d)
                              .WithFormat(TextureFormat.Rgba8)
                              .Build(engine);
                    texture.SetImage(engine, 0, pixelBuffer);
                }

                // Set up view
                skybox = SkyboxBuilder.Create()
                         .WithColor(new Color(0.1f, 0.125f, 0.25f, 1.0f))
                         .Build(engine);

                scene.Skybox = skybox;
                cameraEntity = EntityManager.Create();
                camera       = engine.CreateCamera(cameraEntity);

                view.PostProcessingEnabled = false;
                view.Camera = camera;

                // Create quad renderable
                var vbo = new VertexBufferObject();
                vbo.Write(new Vector2(-1, -1));
                vbo.Write(new Vector2(0, 0));
                vbo.Write(new Vector2(1, -1));
                vbo.Write(new Vector2(1, 0));
                vbo.Write(new Vector2(-1, 1));
                vbo.Write(new Vector2(0, 1));
                vbo.Write(new Vector2(1, 1));
                vbo.Write(new Vector2(1, 1));

                vertexBuffer = VertexBufferBuilder.Create()
                               .WithVertexCount(4)
                               .WithBufferCount(1)
                               .WithAttribute(VertexAttribute.Position, 0, ElementType.Float2, 0, 16)
                               .WithAttribute(VertexAttribute.Uv0, 0, ElementType.Float2, 8, 16)
                               .Build(engine);
                vertexBuffer.SetBufferAt(engine, 0, vbo);

                var sampleData = new SampleDataLoader();

                indexBuffer = IndexBufferBuilder.Create()
                              .WithIndexCount(6)
                              .WithBufferType(IndexType.UShort)
                              .Build(engine);
                indexBuffer.SetBuffer(engine, QUAD_INDICES);

                material = MaterialBuilder.Create()
                           .WithPackage(sampleData.LoadBakedTexture())
                           .Build(engine);

                var sampler = new TextureSampler(SamplerMinFilter.Linear, SamplerMagFilter.Linear);

                materialInstance = material.CreateInstance();
                materialInstance.SetParameter("albedo", texture, sampler);

                renderable = EntityManager.Create();

                RenderableBuilder.Create()
                .WithBoundingBox(
                    new Box(
                        new Vector3(-1, -1, -1),
                        new Vector3(1, 1, 1)
                        )
                    )
                .WithMaterial(0, materialInstance)
                .WithGeometry(0, PrimitiveType.Triangles, vertexBuffer, indexBuffer, 0, 6)
                .WithCulling(false)
                .WithReceiveShadows(false)
                .WithCastShadows(false)
                .Build(engine, renderable);

                scene.AddEntity(renderable);
            };

            app.Cleanup = (engine, view, scene) => {
                engine.Destroy(skybox);
                engine.Destroy(renderable);
                engine.Destroy(materialInstance);
                engine.Destroy(material);
                engine.Destroy(texture);
                engine.Destroy(vertexBuffer);
                engine.Destroy(indexBuffer);

                engine.DestroyCameraComponent(cameraEntity);
                EntityManager.Destroy(cameraEntity);
            };

            app.Animate = (engine, view, now) => {
                var zoom   = 2.0f + 2.0f * MathF.Sin(now);
                var width  = view.Viewport.Width;
                var height = view.Viewport.Height;
                var aspect = (float)width / (float)height;

                camera.SetProjection(Projection.Ortho,
                                     -aspect * zoom, aspect * zoom,
                                     -zoom, zoom,
                                     -1, 1
                                     );
            };

            app.Run();
        }
예제 #5
0
 public Content(GraphicsDevice device)
 {
     this.SkyboxBuilder = new SkyboxBuilder(device);
 }
예제 #6
0
        public bool LoadFromDirectory(string path)
        {
            // First check if KTX files are available.
            if (LoadFromKtx(Path.Combine(path, Path.GetFileName(path))))
            {
                return(true);
            }

            // Read spherical harmonics
            string sh      = Path.Combine(path, "sh.txt");
            var    pattern = new Regex(@"^\([\s]{0,}(.+),[\s]{0,}(.+),[\s]{0,}(.+)\)", RegexOptions.Compiled);

            if (File.Exists(sh))
            {
                var lines = File.ReadAllLines(sh);

                if (lines.Length != _bands.Length)
                {
                    return(false);
                }

                for (var i = 0; i < _bands.Length; i++)
                {
                    var matches = pattern.Matches(lines[i]);

                    if (!pattern.IsMatch(lines[0]))
                    {
                        return(false);
                    }

                    var parts = matches[0].Groups;

                    if (!float.TryParse(parts[1].Value, out var r))
                    {
                        return(false);
                    }

                    if (!float.TryParse(parts[2].Value, out var g))
                    {
                        return(false);
                    }

                    if (!float.TryParse(parts[3].Value, out var b))
                    {
                        return(false);
                    }

                    _bands[i] = new Vector3(r, g, b);
                }
            }
            else
            {
                return(false);
            }

            // Read mip-mapped cubemap
            string prefix = "m";

            if (!LoadCubemapLevel(ref _texture, path, 0, prefix + "0_"))
            {
                return(false);
            }

            int numLevels = _texture.Levels;

            for (var i = 1; i < numLevels; i++)
            {
                LoadCubemapLevel(ref _texture, path, i, prefix + i + "_");
            }

            if (!LoadCubemapLevel(ref _skyboxTexture, path))
            {
                return(false);
            }

            IndirectLight = IndirectLightBuilder.Create()
                            .WithReflections(_texture)
                            .WithIrradiance(3, _bands)
                            .WithIntensity(Intensity)
                            .Build(_engine);

            Skybox = SkyboxBuilder.Create()
                     .WithEnvironment(_skyboxTexture)
                     .WithSun(true)
                     .Build(_engine);

            return(true);
        }