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, }; } }
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); }
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); }
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(); * }*/ }
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(); } }
//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(); } }
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(); } }
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); }