コード例 #1
0
        private static void Initialize(string name)
        {
            if (cntr == 0)
            {
                TerrainTileMesh.Create(2, TerrainTileEdge.None, out var indices);
                indexBuffer = new StreamableBuffer(name + "_indices", (ulong)indices.Length * sizeof(uint), BufferUsage.Index);
                paramBuffer = new StreamableBuffer(name + "_params", 4096, BufferUsage.Uniform);
                indexCount  = (uint)indices.Length;

                unsafe
                {
                    var i_ptr = (uint *)indexBuffer.BeginBufferUpdate();
                    for (int i = 0; i < indices.Length; i++)
                    {
                        i_ptr[i] = indices[i];
                    }
                    indexBuffer.EndBufferUpdate();
                }

                vertexShader = new SpecializedShader()
                {
                    Name               = name + "_Vert",
                    Shader             = ShaderSource.Load(ShaderType.VertexShader, "PlanetTerrain/vertex.glsl"),
                    SpecializationData = null
                };

                fragmentShader = new SpecializedShader()
                {
                    Name               = name + "_Frag",
                    Shader             = ShaderSource.Load(ShaderType.FragmentShader, "UVRenderer/fragment.glsl"),
                    SpecializationData = null,
                };
            }
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: himanshugoel2797/KokoroVR
        static void Main(string[] args)
        {
            Engine.AppName          = "Test";
            Engine.EnableValidation = true;
            Engine.Initialize();

            var graph = new FrameGraph(0);

            Engine.RenderGraph = graph;

            vertS = new SpecializedShader()
            {
                Name               = "FST_Vert",
                Shader             = ShaderSource.Load(ShaderType.VertexShader, "FullScreenTriangle/vertex.glsl"),
                SpecializationData = null
            };

            fragS = new SpecializedShader()
            {
                Name               = "UVR_Frag",
                Shader             = ShaderSource.Load(ShaderType.FragmentShader, "FullScreenTriangle/clear_frag.glsl"),
                SpecializationData = null,
            };

            depthImages     = new Image[GraphicsDevice.MaxFramesInFlight];
            depthImageViews = new ImageView[GraphicsDevice.MaxFramesInFlight];
            for (int i = 0; i < GraphicsDevice.MaxFramesInFlight; i++)
            {
                depthImages[i] = new Image($"depthImage_{i}")
                {
                    Cubemappable  = false,
                    Width         = GraphicsDevice.Width,
                    Height        = GraphicsDevice.Height,
                    Depth         = 1,
                    Dimensions    = 2,
                    InitialLayout = ImageLayout.Undefined,
                    Layers        = 1,
                    Levels        = 1,
                    MemoryUsage   = MemoryUsage.GpuOnly,
                    Usage         = ImageUsage.DepthAttachment | ImageUsage.Sampled,
                    Format        = ImageFormat.Depth32f,
                };
                depthImages[i].Build(0);

                depthImageViews[i] = new ImageView($"depthImageView_{i}")
                {
                    BaseLayer  = 0,
                    BaseLevel  = 0,
                    Format     = ImageFormat.Depth32f,
                    LayerCount = 1,
                    LevelCount = 1,
                    ViewType   = ImageViewType.View2D,
                };
                depthImageViews[i].Build(depthImages[i]);
            }

            planetBuffers = new StreamableBuffer("planetBuffer", 2049 * 2049 * 2 * 6, BufferUsage.Storage);
            unsafe
            {
                var us_ptr = (ushort *)planetBuffers.BeginBufferUpdate();
                for (int i = 0; i < 6; i++)
                {
                    using (FileStream fs = File.OpenRead($"face_eroded_{i}.bin"))
                        using (BinaryReader br = new BinaryReader(fs))
                            for (int j = 0; j < 2049 * 2049; j++)
                            {
                                us_ptr[j] = br.ReadUInt16();
                            }
                    us_ptr += 2049 * 2049;
                }
                planetBuffers.EndBufferUpdate();
            }

            planet = new Planet("terrain_", "planetBuffer", 6000, null);

            Engine.OnRebuildGraph += Engine_OnRebuildGraph;
            Engine.OnRender       += Engine_OnRender;
            Engine.OnUpdate       += Engine_OnUpdate;
            Engine.Start(0);
        }
コード例 #3
0
        static void Main(string[] args)
        {
            Engine.AppName          = "Test";
            Engine.EnableValidation = true;
            Engine.RebuildShaders   = true;
            Engine.Initialize();

            var graph = new FrameGraph(0);

            Engine.RenderGraph = graph;

            int trace_side       = 1024;
            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();

            using (var fs = File.OpenRead("sponza.obj"))
            {
                var obj_loaded = objLoader.Load(fs);

                ulong idxCount = 0;
                for (int i = 0; i < obj_loaded.Groups.Count; i++)
                {
                    idxCount += (ulong)obj_loaded.Groups[i].Faces.Count * 3;
                }

                vertexBuffer     = new StreamableBuffer("vbo", (ulong)obj_loaded.Vertices.Count * 3 * sizeof(float), BufferUsage.Storage);
                indexBuffer      = new StreamableBuffer("ibo", idxCount * sizeof(uint), BufferUsage.Index | BufferUsage.Storage);
                rayIntersections = new RayIntersections("rayInter", (uint)trace_side * (uint)trace_side, 0);
                geometry         = new RayGeometry("rayGeom", (uint)obj_loaded.Vertices.Count);
                unsafe
                {
                    float *fp = (float *)vertexBuffer.BeginBufferUpdate();
                    for (int i = 0; i < obj_loaded.Vertices.Count; i++)
                    {
                        fp[0] = obj_loaded.Vertices[i].X;
                        fp[1] = obj_loaded.Vertices[i].Y;
                        fp[2] = obj_loaded.Vertices[i].Z;

                        fp += 3;
                    }
                    vertexBuffer.EndBufferUpdate();

                    uint *ui = (uint *)indexBuffer.BeginBufferUpdate();
                    for (int i = 0; i < obj_loaded.Groups.Count; i++)
                    {
                        for (int j = 0; j < obj_loaded.Groups[i].Faces.Count; j++)
                        {
                            ui[0] = (uint)(obj_loaded.Groups[i].Faces[j][0].VertexIndex - 1);
                            ui[1] = (uint)(obj_loaded.Groups[i].Faces[j][1].VertexIndex - 1);
                            ui[2] = (uint)(obj_loaded.Groups[i].Faces[j][2].VertexIndex - 1);

                            ui += 3;
                        }
                    }
                    indexBuffer.EndBufferUpdate();

                    float *rp = (float *)rayIntersections.RayBuffer.BeginBufferUpdate();
                    for (uint x = 0; x < trace_side; x++)
                    {
                        for (uint y = 0; y < trace_side; y++)
                        {
                            //uint i = 0;
                            //for(int j = 0; j < 15; j++)
                            //{
                            //    i |= ((x & (1u << j)) << j) | ((y & (1u << j)) << (j + 1));
                            //}

                            //i *= 8;
                            uint i = ((uint)trace_side * y + x) * 8;
                            rp[i + 0] = 0.0f;
                            rp[i + 1] = 15.0f;
                            rp[i + 2] = 0.0f;

                            rp[i + 4] = -1.0f;
                            rp[i + 5] = -1.0f + (2.0f / trace_side) * y;
                            rp[i + 6] = -1.0f + (2.0f / trace_side) * x;

                            rp[i + 3] = 0.001f;
                            rp[i + 7] = 100000.0f;
                        }
                    }
                    rayIntersections.RayBuffer.EndBufferUpdate();

                    geometry.SetupBuild(0, (uint)(idxCount / 3), vertexBuffer.LocalBuffer, 0, indexBuffer.LocalBuffer, 0, false);
                }
            }


            vertS = new SpecializedShader()
            {
                Name               = "FST_Vert",
                Shader             = ShaderSource.Load(ShaderType.VertexShader, "FullScreenTriangle/vertex.glsl"),
                SpecializationData = null
            };

            fragS = new SpecializedShader()
            {
                Name               = "UVR_Frag",
                Shader             = ShaderSource.Load(ShaderType.FragmentShader, "FullScreenTriangle/clear_frag.glsl"),
                SpecializationData = null,
            };

            depthImages     = new Image[GraphicsDevice.MaxFramesInFlight];
            depthImageViews = new ImageView[GraphicsDevice.MaxFramesInFlight];
            for (int i = 0; i < GraphicsDevice.MaxFramesInFlight; i++)
            {
                depthImages[i] = new Image($"depthImage_{i}")
                {
                    Cubemappable  = false,
                    Width         = GraphicsDevice.Width,
                    Height        = GraphicsDevice.Height,
                    Depth         = 1,
                    Dimensions    = 2,
                    InitialLayout = ImageLayout.Undefined,
                    Layers        = 1,
                    Levels        = 1,
                    MemoryUsage   = MemoryUsage.GpuOnly,
                    Usage         = ImageUsage.DepthAttachment | ImageUsage.Sampled,
                    Format        = ImageFormat.Depth32f,
                };
                depthImages[i].Build(0);

                depthImageViews[i] = new ImageView($"depthImageView_{i}")
                {
                    BaseLayer  = 0,
                    BaseLevel  = 0,
                    Format     = ImageFormat.Depth32f,
                    LayerCount = 1,
                    LevelCount = 1,
                    ViewType   = ImageViewType.View2D,
                };
                depthImageViews[i].Build(depthImages[i]);
            }

            Engine.OnRebuildGraph += Engine_OnRebuildGraph;
            Engine.OnRender       += Engine_OnRender;
            Engine.OnUpdate       += Engine_OnUpdate;
            Engine.Start(0);
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: himanshugoel2797/KokoroVR
        static void Main(string[] args)
        {
            GraphicsDevice.AppName          = "Vulkan Test";
            GraphicsDevice.EnableValidation = true;
            GraphicsDevice.RebuildShaders   = true;
            GraphicsDevice.Init();

            graph = new FrameGraph(0);

            var vertS = new SpecializedShader()
            {
                Name               = "FST_Vert",
                Shader             = ShaderSource.Load(ShaderType.VertexShader, "FullScreenTriangle/vertex.glsl"),
                SpecializationData = null
            };

            var fragS = new SpecializedShader()
            {
                Name               = "UVR_Frag",
                Shader             = ShaderSource.Load(ShaderType.FragmentShader, "UVRenderer/fragment.glsl"),
                SpecializationData = null,
            };

            graph.RegisterShader(vertS);
            graph.RegisterShader(fragS);

            for (int i = 0; i < GraphicsDevice.MaxFramesInFlight; i++)
            {
                var out_img = GraphicsDevice.DefaultFramebuffer[i].ColorAttachments[0];
                graph.RegisterResource(out_img);
            }

            var gpass = new GraphicsPass("main_pass")
            {
                Shaders          = new string[] { vertS.Name, fragS.Name },
                ViewportWidth    = GraphicsDevice.Width,
                ViewportHeight   = GraphicsDevice.Height,
                ViewportDynamic  = false,
                DepthWriteEnable = false,
                CullMode         = CullMode.None,
                RenderLayout     = new RenderLayout()
                {
                    Color = new RenderLayoutEntry[]
                    {
                        new RenderLayoutEntry()
                        {
                            DesiredLayout  = ImageLayout.ColorAttachmentOptimal,
                            FirstLoadStage = PipelineStage.ColorAttachOut,
                            Format         = GraphicsDevice.DefaultFramebuffer[GraphicsDevice.CurrentFrameID].ColorAttachments[0].Format,
                            LastStoreStage = PipelineStage.ColorAttachOut,
                            LoadOp         = AttachmentLoadOp.DontCare,
                            StoreOp        = AttachmentStoreOp.Store,
                        },
                    },
                    Depth = null,
                },
                DescriptorSetup = new DescriptorSetup()
                {
                    Descriptors   = null,
                    PushConstants = null,
                },
            };

            graph.RegisterGraphicsPass(gpass);
            graph.GatherDescriptors();

            GraphicsDevice.Window.Render += Window_Render;
            GraphicsDevice.Window.Run(60);

            /*
             * var fbuf = new Framegraph(0);
             * fbuf.RegisterAttachment(new AttachmentInfo()
             * {
             *  Name = "output",
             *  BaseSize = SizeClass.ScreenRelative,
             *  SizeX = 1,
             *  SizeY = 1,
             *  Format = ImageFormat.B8G8R8A8Unorm,
             *  Layers = 1,
             *  UseMipMaps = false,
             *  Usage = ImageUsage.ColorAttachment | ImageUsage.Sampled,
             * });
             * fbuf.RegisterAttachment(new AttachmentInfo()
             * {
             *  Name = "output_dpth",
             *  BaseSize = SizeClass.ScreenRelative,
             *  SizeX = 1,
             *  SizeY = 1,
             *  Format = ImageFormat.Depth32f,
             *  Layers = 1,
             *  UseMipMaps = false,
             *  Usage = ImageUsage.DepthAttachment | ImageUsage.TransferSrc,
             * });
             * fbuf.RegisterShaderParams(new ShaderParameterSet()
             * {
             *  Name = "output_shader_params",
             *  Buffers = null,
             *  SampledAttachments = null,
             *  Textures = null,
             * });
             * fbuf.RegisterPass(new GraphicsPass()
             * {
             *  Name = "main_pass",
             *  CullMode = CullMode.None,
             *  DepthAttachment = new AttachmentUsageInfo()
             *  {
             *      Name = "output_dpth",
             *      Usage = AttachmentUsage.WriteOnly
             *  },
             *  AttachmentUsage = new AttachmentUsageInfo[]{
             *      new AttachmentUsageInfo(){
             *          Name = "output",
             *          Usage = AttachmentUsage.WriteOnly
             *      }
             *  },
             *  DepthClamp = false,
             *  DepthTest = DepthTest.Always,
             *  EnableBlending = false,
             *  LineWidth = 1,
             *  PassDependencies = null,
             *  RasterizerDiscard = false,
             *  Shaders = new ShaderSource[] { vert, frag },
             *  Topology = PrimitiveType.Triangle,
             *  DrawCmd = new PlainDrawCmd()
             *  {
             *      BaseInstance = 0,
             *      BaseVertex = 0,
             *      InstanceCount = 1,
             *      VertexCount = 3
             *  }
             * });
             * fbuf.SetOutputPass("output");
             * fbuf.Compile();
             * while (!GraphicsDevice.Window.IsExiting)
             * {
             *  fbuf.Execute(true);
             *  GraphicsDevice.Window.PollEvents();
             * }*/
        }
コード例 #5
0
        public static void Run()
        {
            GraphicsContext context = new GraphicsContext()
            {
                Camera = new FirstPersonCamera(new Vector3(4, 3, 3), Vector3.UnitY)
            };
            Matrix4 World = Matrix4.Identity;


            VoxelTypeMap v = new VoxelTypeMap();

            v[0] = new VoxelTypeMap.VoxelTypeData()
            {
                Color   = Vector4.One,
                Visible = false
            };

            v[1] = new VoxelTypeMap.VoxelTypeData()
            {
                Color   = Vector4.UnitY * 0.7f + Vector4.UnitW,
                Visible = true
            };

            v[2] = new VoxelTypeMap.VoxelTypeData()
            {
                Color   = Vector4.UnitX + Vector4.UnitW,
                Visible = true
            };

            BlockManager man = new BlockManager();

            man.Side       = 32;
            man.VoxelTypes = v;

            //Rendering stuff
            ShaderProgram prog = null;

            GraphicsDevice.Load += () =>
            {
                //GraphicsDevice.Winding = FaceWinding.Clockwise;
                GraphicsDevice.CullMode         = OpenTK.Graphics.OpenGL4.CullFaceMode.Back;
                GraphicsDevice.DepthTestEnabled = true;
                GraphicsDevice.Window.KeyUp    += (k, e) =>
                {
                    if (e.Key == OpenTK.Input.Key.Z)
                    {
                        GraphicsDevice.Wireframe = !GraphicsDevice.Wireframe;
                    }
                    else if (e.Key == OpenTK.Input.Key.C)
                    {
                        GraphicsDevice.CullEnabled = !GraphicsDevice.CullEnabled;
                    }
                };

                Random rng = new Random(0);
                double n   = 64;

                v.UpdateBuffers();
                GraphicsDevice.SetBufferTexture(0, v.ColorData);

                ShaderSource vShader = ShaderSource.Load(OpenTK.Graphics.OpenGL4.ShaderType.VertexShader, "Testing/VoxTest/vertex.glsl");
                ShaderSource fShader = ShaderSource.Load(OpenTK.Graphics.OpenGL4.ShaderType.FragmentShader, "Testing/VoxTest/fragment.glsl");

                prog = new ShaderProgram(vShader, fShader);
                prog.Set("materialColors", 0);
            };

            GraphicsDevice.Update += (e) =>
            {
                context.Update(e);

                //World *= Matrix4.CreateRotationY(0.01f);

                prog.Set("World", Matrix4.Identity);
                prog.Set("View", context.View);
                prog.Set("Proj", context.Projection);
                prog.Set("Fcoef", (float)(2.0f / Math.Log(1000001) / Math.Log(2)));
                prog.Set("lightDir", new Vector3(5, 10, 5).Normalized());
            };


            GraphicsDevice.Render += (e) =>
            {
                GraphicsDevice.Clear();

                for (int k = -2; k < 0; k++)
                {
                    Vector3 a = new Vector3();
                    a.Y = k * man.Side;
                    for (int i = -5; i <= 5; i++)
                    {
                        a.Z = i * man.Side;
                        for (int j = -5; j <= 5; j++)
                        {
                            a.X = j * man.Side;
                            Vector3 dir = (context.Camera as FirstPersonCamera).Direction;
                            if (Vector3.Dot(dir.Normalized(), a.Normalized()) >= -0.3)
                            {
                                //Chunk c = man.Draw(-Vector3.UnitY * 123, out World);
                                Chunk c = man.Draw(context.Camera.Position + a, out World);
                                if (c.ChunkReady)
                                {
                                    c.Bind();
                                    prog.Set("World", World);

                                    prog.Set("range1", c.NormalOffsets[1]);
                                    prog.Set("range2", c.NormalOffsets[2]);
                                    prog.Set("range3", c.NormalOffsets[3]);
                                    prog.Set("range4", c.NormalOffsets[4]);
                                    prog.Set("range5", c.NormalOffsets[5]);
                                    GraphicsDevice.SetShaderProgram(prog);


                                    GraphicsDevice.Draw(OpenTK.Graphics.OpenGL4.PrimitiveType.Triangles, 0, c.NormalGroupSizes[6]);
                                }
                            }
                        }
                    }
                }

                GraphicsDevice.SwapBuffers();
            };

            GraphicsDevice.Name = "Voxel Test";
            GraphicsDevice.Run(60, 0);
            if (GraphicsDevice.Cleanup != null)
            {
                GraphicsDevice.Cleanup();
            }
        }
コード例 #6
0
        //Deferred Renderer Rework - New GBuffer -
        //32:32:32 WorldPos, (16b:SPARE, 16b:materialIdx)
        //8:8:8 Norm, 8:SPARE
        //reproject z buffer and recompute chain for culling

        public DeferredRenderer(Framebuffer[] fbufs, LightManager man)
        {
            lMan = man;

            InfoBindings  = new TextureBinding[fbufs.Length];
            InfoBindings2 = new TextureBinding[fbufs.Length];
            DepthBindings = new TextureBinding[fbufs.Length];
            Framebuffers  = new Framebuffer[fbufs.Length];
            HiZMap        = new TextureView[fbufs.Length][];
            views         = new ViewData[fbufs.Length];
            HiZMapUBO     = new UniformBuffer(false);
            unsafe
            {
                int    off = 0;
                float *fp  = (float *)HiZMapUBO.Update();
                fp += 4;
                for (int i = 0; i < views.Length; i++)
                {
                    views[i] = new ViewData()
                    {
                        depthBuf = new Texture()
                        {
                            Width           = fbufs[i].Width,
                            Height          = fbufs[i].Height,
                            Depth           = 1,
                            Format          = PixelInternalFormat.DepthComponent32f,
                            GenerateMipmaps = false,
                            LayerCount      = 1,
                            LevelCount      = 1,
                            Target          = TextureTarget.Texture2D
                        }.Build(),
                        infoTex = new Texture()
                        {
                            Width           = fbufs[i].Width,
                            Height          = fbufs[i].Height,
                            Depth           = 1,
                            Format          = PixelInternalFormat.Rgba32f,
                            GenerateMipmaps = false,
                            LayerCount      = 1,
                            LevelCount      = 1,
                            Target          = TextureTarget.Texture2D
                        }.Build(),
                        infoTex2 = new Texture()
                        {
                            Width           = fbufs[i].Width,
                            Height          = fbufs[i].Height,
                            Depth           = 1,
                            Format          = PixelInternalFormat.Rgba8,
                            GenerateMipmaps = false,
                            LayerCount      = 1,
                            LevelCount      = 1,
                            Target          = TextureTarget.Texture2D
                        }.Build(),
                        hiZ = new Texture()
                        {
                            Width           = fbufs[i].Width,
                            Height          = fbufs[i].Height,
                            Depth           = 1,
                            Format          = PixelInternalFormat.Rg32f,
                            GenerateMipmaps = false,
                            LayerCount      = 1,
                            LevelCount      = (int)(MathHelper.Log2((ulong)Math.Max(fbufs[i].Width, fbufs[i].Height)) + 1),
                            Target          = TextureTarget.Texture2D
                        }.Build(),
                        gbuffer = new Framebuffer(fbufs[i].Width, fbufs[i].Height),
                    };

                    views[i].depthView = new TextureView()
                    {
                        BaseLayer  = 0,
                        BaseLevel  = 0,
                        Format     = PixelInternalFormat.DepthComponent32f,
                        LayerCount = 1,
                        LevelCount = 1,
                        Target     = TextureTarget.Texture2D
                    }.Build(views[i].depthBuf);

                    views[i].infoView = new TextureView()
                    {
                        BaseLayer  = 0,
                        BaseLevel  = 0,
                        Format     = PixelInternalFormat.Rgba32f,
                        LayerCount = 1,
                        LevelCount = 1,
                        Target     = TextureTarget.Texture2D
                    }.Build(views[i].infoTex);

                    views[i].infoView2 = new TextureView()
                    {
                        BaseLayer  = 0,
                        BaseLevel  = 0,
                        Format     = PixelInternalFormat.Rgba8,
                        LayerCount = 1,
                        LevelCount = 1,
                        Target     = TextureTarget.Texture2D
                    }.Build(views[i].infoTex2);

                    views[i].hiZView = new TextureView[views[i].hiZ.LevelCount];
                    for (int j = 0; j < views[i].hiZView.Length; j++)
                    {
                        views[i].hiZView[j] = new TextureView()
                        {
                            BaseLayer  = 0,
                            BaseLevel  = j,
                            Format     = PixelInternalFormat.Rg32f,
                            LayerCount = 1,
                            LevelCount = 1,
                            Target     = TextureTarget.Texture2D,
                        }.Build(views[i].hiZ);
                        var f_arr = (float[])views[i].hiZView[j].GetImageHandle().SetResidency(Residency.Resident, AccessMode.ReadWrite);
                        for (int q = 0; q < f_arr.Length; q++)
                        {
                            *(fp++) = f_arr[q];
                        }
                        fp += 2;
                    }
                    views[i].hiZTex = new TextureView()
                    {
                        BaseLayer  = 0,
                        BaseLevel  = 0,
                        Format     = PixelInternalFormat.Rg32f,
                        LayerCount = 1,
                        LevelCount = views[i].hiZView.Length,
                        Target     = TextureTarget.Texture2D
                    }.Build(views[i].hiZ);

                    var sampler = new TextureSampler();
                    sampler.SetEnableLinearFilter(false, true, false);
                    sampler.MinReadLevel = 0;
                    sampler.MaxReadLevel = views[i].hiZView.Length;
                    sampler.SetTileMode(TileMode.ClampToBorder, TileMode.ClampToBorder);

                    views[i].hiZBinding = new TextureBinding()
                    {
                        View    = views[i].hiZTex,
                        Sampler = sampler
                    };
                    var f_arr_ = (float[])views[i].hiZBinding.GetTextureHandle().SetResidency(Residency.Resident);
                    for (int q = 0; q < f_arr_.Length; q++)
                    {
                        *(fp++) = f_arr_[q];
                    }
                    fp += 2;

                    views[i].gbuffer[FramebufferAttachment.DepthAttachment]  = views[i].depthView;
                    views[i].gbuffer[FramebufferAttachment.ColorAttachment0] = views[i].infoView;
                    views[i].gbuffer[FramebufferAttachment.ColorAttachment1] = views[i].infoView2;
                    Framebuffers[i] = views[i].gbuffer;

                    views[i].program = new ShaderProgram(
                        ShaderSource.Load(ShaderType.VertexShader, "Shaders/RenderToTexture/FrameBufferTriangle/vertex.glsl"),
                        ShaderSource.Load(ShaderType.FragmentShader, "Shaders/RenderToTexture/FrameBufferTriangle/fragment.glsl")
                        );
                    views[i].copy = new ShaderProgram(
                        ShaderSource.Load(ShaderType.ComputeShader, "Shaders/HiZ/copy.glsl", $"#define MIP_COUNT {views[i].hiZView.Length}")
                        );
                    views[i].copyState = new RenderState(null, views[i].copy, null, new UniformBuffer[] { Engine.GlobalParameters, HiZMapUBO }, false, false, DepthFunc.Always, InverseDepth.Far, InverseDepth.Near, BlendFactor.SrcAlpha, BlendFactor.OneMinusSrcAlpha, Vector4.Zero, InverseDepth.ClearDepth, CullFaceMode.Back);
                    views[i].mipchain  = new ShaderProgram(
                        ShaderSource.Load(ShaderType.ComputeShader, "Shaders/HiZ/mipchain.glsl", $"#define MIP_COUNT {views[i].hiZView.Length}")
                        );
                    views[i].mipchainState = new RenderState(null, views[i].mipchain, null, new UniformBuffer[] { Engine.GlobalParameters, HiZMapUBO }, false, false, DepthFunc.Always, InverseDepth.Far, InverseDepth.Near, BlendFactor.SrcAlpha, BlendFactor.OneMinusSrcAlpha, Vector4.Zero, InverseDepth.ClearDepth, CullFaceMode.Back);

                    views[i].state = new RenderState(fbufs[i], views[i].program, null, new UniformBuffer[] { Engine.GlobalParameters }, false, true, DepthFunc.Always, InverseDepth.Far, InverseDepth.Near, BlendFactor.SrcAlpha, BlendFactor.OneMinusSrcAlpha, Vector4.Zero, InverseDepth.ClearDepth, CullFaceMode.None);

                    InfoBindings[i] = new TextureBinding()
                    {
                        View    = views[i].infoView,
                        Sampler = TextureSampler.Default
                    };
                    InfoBindings[i].GetTextureHandle().SetResidency(Residency.Resident);

                    InfoBindings2[i] = new TextureBinding()
                    {
                        View    = views[i].infoView2,
                        Sampler = TextureSampler.Default
                    };
                    InfoBindings2[i].GetTextureHandle().SetResidency(Residency.Resident);

                    DepthBindings[i] = new TextureBinding()
                    {
                        View    = views[i].depthView,
                        Sampler = TextureSampler.Default,
                    };
                    DepthBindings[i].GetTextureHandle().SetResidency(Residency.Resident);

                    HiZMap[i] = views[i].hiZView;

                    views[i].cBuffer = new CommandBuffer();
                    views[i].cBuffer.SetRenderState(views[i].state);
                    views[i].cBuffer.Draw(PrimitiveType.Triangles, 0, 3, 1, 0);
                }
                HiZMapUBO.UpdateDone();
            }
        }
コード例 #7
0
        public static void Run()
        {
            ShaderProgram prog = null, terrProg = null;
            Texture       tex = null, t2 = null;

            GraphicsContext context = new GraphicsContext()
            {
                Camera = new FirstPersonCamera(new Vector3(4, 3, 3), Vector3.UnitY)
            };

            BitmapTextureSource bmpTex, b2, b3;

            bmpTex = TextDrawer.CreateWriter("Times New Roman", FontStyle.Regular).Write("Hello!", 200, System.Drawing.Color.White);
            b2     = new BitmapTextureSource("test.jpg", 0);
            b3     = new BitmapTextureSource("test.png", 0);


            Texture fbufTex = null, t3 = null;
            FramebufferTextureSource fbufTexSrc = new FramebufferTextureSource(256, 256, 0);
            Framebuffer fbuf = null;

            Matrix4      World = Matrix4.Identity;
            EngineObject eObj = null, fsq = null;
            float        timer = 0;

            CubeMapTextureSource tFace = new CubeMapTextureSource(CubeMapTextureSource.CubeMapFace.PositiveY, b3),
                                 bFace = new CubeMapTextureSource(CubeMapTextureSource.CubeMapFace.PositiveX, b3),
                                 lFace = new CubeMapTextureSource(CubeMapTextureSource.CubeMapFace.PositiveZ, b3),
                                 rFace = new CubeMapTextureSource(CubeMapTextureSource.CubeMapFace.NegativeX, b3),
                                 fFace = new CubeMapTextureSource(CubeMapTextureSource.CubeMapFace.NegativeY, b3),
                                 hFace = new CubeMapTextureSource(CubeMapTextureSource.CubeMapFace.NegativeZ, b3);

            GraphicsDevice.Load += () =>
            {
                // setup settings, load textures, sounds
                GraphicsDevice.Wireframe        = false;
                GraphicsDevice.AlphaEnabled     = true;
                GraphicsDevice.DepthTestEnabled = true;
                GraphicsDevice.CullEnabled      = false;
                GraphicsDevice.CullMode         = CullFaceMode.Back;

                eObj = new EngineObject();
                float[] data =
                { -1, -1, 1,
                  1,  -1, 1,
                  0,   1, 1 };

                uint[] indexData = new uint[]
                {
                    0, 1, 2
                };


                ShaderSource vert  = ShaderSource.Load(ShaderType.VertexShader, "Testing/TG_A/vertex.glsl");
                ShaderSource frag  = ShaderSource.Load(ShaderType.FragmentShader, "Testing/TG_A/fragment.glsl");
                ShaderSource tctrl = ShaderSource.Load(ShaderType.TessControlShader, "Testing/TG_A/tesscontrol.glsl");
                ShaderSource teval = ShaderSource.Load(ShaderType.TessEvaluationShader, "Testing/TG_A/tessdomain.glsl");

                ShaderSource vA = ShaderSource.Load(ShaderType.VertexShader, "Shaders/TerrainGen/vertex.glsl");
                ShaderSource fA = ShaderSource.Load(ShaderType.FragmentShader, "Shaders/TerrainGen/fragment.glsl");
                terrProg = new ShaderProgram(vA, fA);
                terrProg.Set("World", Matrix4.Identity);

                fbuf    = new Framebuffer(256, 256);
                fbufTex = new Texture();
                fbufTex.SetData(fbufTexSrc);
                fbuf[FramebufferAttachment.ColorAttachment0] = fbufTex;

                fsq = FullScreenQuadFactory.Create();

                t3 = new Texture();
                t3.SetData(tFace);
                t3.SetData(bFace);
                t3.SetData(lFace);
                t3.SetData(rFace);
                t3.SetData(fFace);
                t3.SetData(hFace);
                t3.SetEnableLinearFilter(true);
                t3.SetAnisotropicFilter(Texture.MaxAnisotropy);

                tex = new Texture();
                tex.SetData(bmpTex);
                tex.SetAnisotropicFilter(Texture.MaxAnisotropy);

                t2 = new Texture();
                t2.SetData(b3);
                t2.SetAnisotropicFilter(Texture.MaxAnisotropy);


                prog = new ShaderProgram(vert, tctrl, teval, frag);
                prog.Set("img", 0);
                prog.Set("heightmap", 1);
                prog.Set("World", World);

                vert.Dispose();
                frag.Dispose();
                tctrl.Dispose();
                teval.Dispose();

                //eObj = FullScreenQuadFactory.Create();
                eObj = CubeFactory.Create();
                eObj.SetTexture(0, t2);
                eObj.SetTexture(1, t3);

                b3.Dispose();
            };
            bool eyePosStill = false;

            GraphicsDevice.Update += (e) =>
            {
                // add game logic, input handling
                if (GraphicsDevice.Keyboard[Key.Escape])
                {
                    GraphicsDevice.Exit();
                }

                if (GraphicsDevice.Keyboard[Key.Z])
                {
                    GraphicsDevice.Wireframe = !GraphicsDevice.Wireframe;
                    //GraphicsDevice.CullEnabled = !GraphicsDevice.Wireframe;
                }

                if (GraphicsDevice.Keyboard[Key.F])
                {
                    eyePosStill = !eyePosStill;
                    Console.WriteLine("EyePosStill = " + eyePosStill);
                }

                context.Update(e);
                //context.Projection = Matrix4.Identity;
                //context.View = Matrix4.Identity;

                prog.Set("View", context.View);
                prog.Set("Proj", context.Projection);
                if (!eyePosStill)
                {
                    prog.Set("eyePos", context.Camera.Position);
                }

                prog.Set("Fcoef", (float)(2.0f / Math.Log(1000001) / Math.Log(2)));

                //timer += 0.001f;
                //World = Matrix4.RotateY(timer);
                World = Matrix4.CreateScale(10);
                prog.Set("World", World);

                prog.Set("timer", timer);
                terrProg.Set("timer", timer);
            };

            bool te1 = false;

            GraphicsDevice.Render += (e) =>
            {
                GraphicsDevice.SetFramebuffer(fbuf);
                GraphicsDevice.Clear();

                fsq.Bind();
                GraphicsDevice.SetShaderProgram(terrProg);
                GraphicsDevice.SetViewport(0, 0, 256, 256);
                GraphicsDevice.Draw(PrimitiveType.Triangles, 0, fsq.IndexCount);

                eObj.Bind();
                GraphicsDevice.SetShaderProgram(prog);
                GraphicsDevice.SetViewport(0, 0, GraphicsDevice.WindowSize.Width, GraphicsDevice.WindowSize.Height);
                GraphicsDevice.PatchCount = 3;
                GraphicsDevice.Draw(PrimitiveType.Patches, 0, eObj.IndexCount);

                GraphicsDevice.SwapBuffers();
                if (!te1)
                {
                    te1 = true;
                    GraphicsDevice.SaveTexture(fbufTex, "test1.png");
                }
            };

            GraphicsDevice.Name = "The Julis Faction";
            // Run the game at 60 updates per second
            GraphicsDevice.Run(60.0, 60.0);
            if (GraphicsDevice.Cleanup != null)
            {
                GraphicsDevice.Cleanup();
            }
        }
コード例 #8
0
ファイル: Program.cs プロジェクト: himanshugoel2797/KokoroVR
        static void Main(string[] args)
        {
            Engine.AppName          = "Kokoro.PlanetGen.Gpu";
            Engine.EnableValidation = true;
            Engine.RebuildShaders   = true;
            Engine.Initialize();

            var graph = new FrameGraph(0);

            Engine.RenderGraph = graph;

            dropletCache = new GpuBuffer("dropletCache")
            {
                Usage       = BufferUsage.Storage | BufferUsage.TransferSrc,
                MemoryUsage = MemoryUsage.GpuOnly,
                Mapped      = false,
            };
            dropletCache.Build(0);

            //Generate a heightmap
            heightMap = new HeightMapGen("heightMap", terrainSide);

            //Populate particle buffer
            //Iterate particle simulation

            vertS = new SpecializedShader()
            {
                Name               = "FST_Vert",
                Shader             = ShaderSource.Load(ShaderType.VertexShader, "FullScreenTriangle/vertex.glsl"),
                SpecializationData = null
            };

            fragS = new SpecializedShader()
            {
                Name               = "UVR_Frag",
                Shader             = ShaderSource.Load(ShaderType.FragmentShader, "FullScreenTriangle/clear_frag.glsl"),
                SpecializationData = null,
            };

            depthImages     = new Image[GraphicsDevice.MaxFramesInFlight];
            depthImageViews = new ImageView[GraphicsDevice.MaxFramesInFlight];
            for (int i = 0; i < GraphicsDevice.MaxFramesInFlight; i++)
            {
                depthImages[i] = new Image($"depthImage_{i}")
                {
                    Cubemappable  = false,
                    Width         = GraphicsDevice.Width,
                    Height        = GraphicsDevice.Height,
                    Depth         = 1,
                    Dimensions    = 2,
                    InitialLayout = ImageLayout.Undefined,
                    Layers        = 1,
                    Levels        = 1,
                    MemoryUsage   = MemoryUsage.GpuOnly,
                    Usage         = ImageUsage.DepthAttachment | ImageUsage.Sampled,
                    Format        = ImageFormat.Depth32f,
                };
                depthImages[i].Build(0);

                depthImageViews[i] = new ImageView($"depthImageView_{i}")
                {
                    BaseLayer  = 0,
                    BaseLevel  = 0,
                    Format     = ImageFormat.Depth32f,
                    LayerCount = 1,
                    LevelCount = 1,
                    ViewType   = ImageViewType.View2D,
                };
                depthImageViews[i].Build(depthImages[i]);
            }

            Engine.OnRebuildGraph += Engine_OnRebuildGraph;
            Engine.OnRender       += Engine_OnRender;
            Engine.OnUpdate       += Engine_OnUpdate;
            Engine.Start(0);
        }