--- /dev/null
+*.fnt eol=lf
<br>adaptation of the gltf PBR sample from Sacha Willems</br>
</p>
-### Presentattion
-**vke.net** (_vulkan engine for .net_) a vulkan abstraction layer writen in c# composed of high level classes encapsulating [vulkan](https://www.khronos.org/vulkan/) objects and commands with `IDispose` model and **reference counting**. [GLFW](https://www.glfw.org/) handles the windowing system.
+### Presentation
+**vke.net** (_vulkan engine for .net_) a vulkan abstraction layer writen in **c#** composed of high level classes encapsulating [vulkan](https://www.khronos.org/vulkan/) objects and commands with `IDispose` model and **reference counting**. [GLFW](https://www.glfw.org/) handles the windowing system.
Vke use autogenerated [vk.net](https://github.com/jpbruyere/vk.net) library for low level binding to vulkan.
+++ /dev/null
-echo //TODO
-echo link = "https://onedrive.live.com/download?cid=B3181664476E9B48&resid=B3181664476E9B48%21167&authkey=APMbPmUMFnlrN6s"
-echo rename downloaded file to datas.zip, and unzip.
<RootDirectory>$(MSBuildThisFileDirectory)../</RootDirectory>
<Deterministic>true</Deterministic>
- <TargetFrameworks>net472</TargetFrameworks>
+ <TargetFrameworks>netcoreapp3.1</TargetFrameworks>
<RepositoryUrl>https://github.com/jpbruyere/vke.net</RepositoryUrl>
<License>MIT</License>
using Glfw;
using Vulkan;
using vke;
+using Image = vke.Image;
namespace delaunay {
class Program : VkWindow {
FrameBuffer[] frameBuffers;
GraphicPipeline grPipeline;
- Image imgResult;
+ Image imgResult;
Queue computeQ, transferQ;
cfg.blendAttachments[0] = new VkPipelineColorBlendAttachmentState (true);
grPipeline = new GraphicPipeline (cfg);
+
+ cfg.DisposeShaders ();
plCompute = new ComputePipeline (
new PipelineLayout (dev, new VkPushConstantRange (VkShaderStageFlags.Compute, 2 * sizeof (int)), dslCompute),
+++ /dev/null
-using System;
-using System.Numerics;
-using System.Runtime.InteropServices;
-using VK;
-
-namespace CVKL {
- public class DebugDrawPipeline : GraphicPipeline {
- public HostBuffer Vertices;
- uint vertexCount;
- uint vboLength = 100 * 6 * sizeof (float);
-
- public DebugDrawPipeline (Device dev, DescriptorSetLayout dsLayout, VkFormat colorFormat, VkSampleCountFlags samples = VkSampleCountFlags.SampleCount1) :
- base (new RenderPass (dev, colorFormat), "Debug draw pipeline") {
-
- GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.LineList, samples);
- cfg.rasterizationState.lineWidth = 1.0f;
- cfg.RenderPass = RenderPass;
- cfg.Layout = new PipelineLayout(dev, dsLayout);
- cfg.Layout.AddPushConstants (
- new VkPushConstantRange (VkShaderStageFlags.Vertex, (uint)Marshal.SizeOf<Matrix4x4> () * 2)
- );
- cfg.AddVertexBinding (0, 6 * sizeof(float));
- cfg.SetVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32b32Sfloat);
-
- cfg.blendAttachments[0] = new VkPipelineColorBlendAttachmentState (true);
-
- cfg.AddShader (VkShaderStageFlags.Vertex, "shaders/debug.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "shaders/debug.frag.spv");
-
- layout = cfg.Layout;
-
- init (cfg);
-
- Vertices = new HostBuffer (dev, VkBufferUsageFlags.VertexBuffer, vboLength);
- Vertices.Map ();
- }
-
- public void AddLine (Vector3 start, Vector3 end, float r, float g, float b) {
- float[] data = {
- start.X, start.Y, start.Z,
- r, g, b,
- end.X, end.Y, end.Z,
- r, g, b
- };
- Vertices.Update (data, 12 * sizeof (float), vertexCount * 6 * sizeof (float));
- vertexCount+=2;
- }
-
- public void RecordDraw (CommandBuffer cmd, Framebuffer fb, Camera camera) {
- RenderPass.Begin (cmd, fb);
- const int ratio = 8;
- cmd.SetViewport (fb.Width/ratio, fb.Height/ratio, (ratio-1) * (int)fb.Width / ratio, (ratio-1) * (int)fb.Height / ratio);
- //cmd.SetViewport (200, 200,100,100,-10,10);//, 4 * (int)fb.Width / 5, 4 * (int)fb.Height / 5);
- cmd.SetScissor (fb.Width / ratio, fb.Height / ratio, (ratio-1) * (int)fb.Width / ratio, (ratio-1) * (int)fb.Height / ratio);
- //cmd.SetScissor (200, 200,100,100);
-
- Matrix4x4 ortho = Matrix4x4.CreateOrthographic (4, 4.0f / camera.AspectRatio,-1,1);
-
- cmd.PushConstant (layout, VkShaderStageFlags.Vertex, ortho);
-
- Bind (cmd);
-
- cmd.BindVertexBuffer (Vertices);
- cmd.Draw (vertexCount);
- RenderPass.End (cmd);
- }
-
- protected override void Dispose (bool disposing) {
- if (disposing) {
- Vertices.Unmap ();
- Vertices.Dispose ();
- }
-
- base.Dispose (disposing);
- }
- }
-
-}
Queue gQueue;
public static int MAX_MATERIAL_COUNT = 4;
public static VkSampleCountFlags NUM_SAMPLES = VkSampleCountFlags.SampleCount1;
- public static VkFormat HDR_FORMAT = VkFormat.R16g16b16a16Sfloat;
+ public static VkFormat HDR_FORMAT = VkFormat.R32g32b32a32Sfloat;
public static VkFormat MRT_FORMAT = VkFormat.R32g32b32a32Sfloat;
public static bool TEXTURE_ARRAY;
if (TEXTURE_ARRAY) {
descLayoutMain.Bindings.Add (new VkDescriptorSetLayoutBinding (7, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler));//texture array
- //descLayoutMain.Bindings.Add (new VkDescriptorSetLayoutBinding (8, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler));//down sampled hdr
} else {
descLayoutTextures = new DescriptorSetLayout (dev,
new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
#if WITH_SHADOWS
cfg.AddShader (dev, VkShaderStageFlags.Fragment, "#shaders.compose_with_shadows.frag.spv", constants);
#else
- cfg.AddShader (VkShaderStageFlags.Fragment, "#shaders.compose.frag.spv", constants);
+ cfg.AddShader (dev, VkShaderStageFlags.Fragment, "#shaders.compose.frag.spv", constants);
#endif
composePipeline = new GraphicPipeline (cfg);
}
+++ /dev/null
-using System;
-using System.Numerics;
-using System.Runtime.InteropServices;
-using Vulkan;
-
-namespace vke {
- public class EnvironmentCube : GraphicPipeline {
-
- GPUBuffer vboSkybox;
-
- public Image cubemap { get; private set; }
- public Image lutBrdf { get; private set; }
- public Image irradianceCube { get; private set; }
- public Image prefilterCube { get; set; }
-
- public EnvironmentCube (string cubemapPath, DescriptorSet dsSkybox, PipelineLayout plLayout, Queue staggingQ, RenderPass renderPass, PipelineCache cache = null)
- : base (renderPass, cache, "EnvCube pipeline") {
-
- using (CommandPool cmdPool = new CommandPool (staggingQ.Dev, staggingQ.index)) {
-
- vboSkybox = new GPUBuffer<float> (staggingQ, cmdPool, VkBufferUsageFlags.VertexBuffer, box_vertices);
-
- cubemap = KTX.KTX.Load (staggingQ, cmdPool, cubemapPath,
- VkImageUsageFlags.Sampled, VkMemoryPropertyFlags.DeviceLocal, true);
- cubemap.CreateView (VkImageViewType.Cube, VkImageAspectFlags.Color);
- cubemap.CreateSampler (VkSamplerAddressMode.ClampToEdge);
- cubemap.SetName ("skybox Texture");
- cubemap.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
-
- GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, renderPass.Samples, false);
- cfg.RenderPass = renderPass;
- cfg.Layout = plLayout;
- cfg.AddVertexBinding (0, 3 * sizeof (float));
- cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat);
- cfg.AddShader (VkShaderStageFlags.Vertex, "#deferred.skybox.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.skybox.frag.spv");
- cfg.multisampleState.rasterizationSamples = Samples;
-
- layout = cfg.Layout;
-
- init (cfg);
-
- generateBRDFLUT (staggingQ, cmdPool);
- generateCubemaps (staggingQ, cmdPool);
- }
-
- }
-
- public void RecordDraw (CommandBuffer cmd) {
- Bind (cmd);
- cmd.BindVertexBuffer (vboSkybox);
- cmd.Draw (36);
- }
-
- #region skybox
-
- static float[] box_vertices = {
- 1.0f, 1.0f,-1.0f, // +X side
- 1.0f, 1.0f, 1.0f,
- 1.0f,-1.0f, 1.0f,
- 1.0f,-1.0f, 1.0f,
- 1.0f,-1.0f,-1.0f,
- 1.0f, 1.0f,-1.0f,
-
- -1.0f,-1.0f,-1.0f, // +X side
- -1.0f,-1.0f, 1.0f,
- -1.0f, 1.0f, 1.0f,
- -1.0f, 1.0f, 1.0f,
- -1.0f, 1.0f,-1.0f,
- -1.0f,-1.0f,-1.0f,
-
- -1.0f, 1.0f,-1.0f, // +Y side
- -1.0f, 1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f,
- -1.0f, 1.0f,-1.0f,
- 1.0f, 1.0f, 1.0f,
- 1.0f, 1.0f,-1.0f,
-
- -1.0f,-1.0f,-1.0f, // -Y side
- 1.0f,-1.0f,-1.0f,
- 1.0f,-1.0f, 1.0f,
- -1.0f,-1.0f,-1.0f,
- 1.0f,-1.0f, 1.0f,
- -1.0f,-1.0f, 1.0f,
-
- -1.0f, 1.0f, 1.0f, // +Z side
- -1.0f,-1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f,
- -1.0f,-1.0f, 1.0f,
- 1.0f,-1.0f, 1.0f,
- 1.0f, 1.0f, 1.0f,
-
- -1.0f,-1.0f,-1.0f, // -Z side
- 1.0f, 1.0f,-1.0f,
- 1.0f,-1.0f,-1.0f,
- -1.0f,-1.0f,-1.0f,
- -1.0f, 1.0f,-1.0f,
- 1.0f, 1.0f,-1.0f,
-
- };
- #endregion
-
- void generateBRDFLUT (Queue staggingQ, CommandPool cmdPool) {
- const VkFormat format = VkFormat.R16g16Sfloat;
- const int dim = 512;
-
- lutBrdf = new Image (Dev, format, VkImageUsageFlags.ColorAttachment | VkImageUsageFlags.Sampled,
- VkMemoryPropertyFlags.DeviceLocal, dim, dim);
- lutBrdf.SetName ("lutBrdf");
-
- lutBrdf.CreateView ();
- lutBrdf.CreateSampler (VkSamplerAddressMode.ClampToEdge);
-
- GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, VkSampleCountFlags.SampleCount1, false);
-
- cfg.Layout = new PipelineLayout (Dev, new DescriptorSetLayout (Dev));
- cfg.RenderPass = new RenderPass (Dev);
- cfg.RenderPass.AddAttachment (format, VkImageLayout.ShaderReadOnlyOptimal);
- cfg.RenderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0, 0, 0) });
- cfg.RenderPass.AddSubpass (new SubPass (VkImageLayout.ColorAttachmentOptimal));
- cfg.AddShader (VkShaderStageFlags.Vertex, "#deferred.genbrdflut.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.genbrdflut.frag.spv");
-
- using (GraphicPipeline pl = new GraphicPipeline (cfg)) {
- using (FrameBuffer fb = new FrameBuffer (cfg.RenderPass, dim, dim, lutBrdf)) {
- CommandBuffer cmd = cmdPool.AllocateCommandBuffer ();
- cmd.Start (VkCommandBufferUsageFlags.OneTimeSubmit);
- pl.RenderPass.Begin (cmd, fb);
- cmd.SetViewport (dim, dim);
- cmd.SetScissor (dim, dim);
- pl.Bind (cmd);
- cmd.Draw (3, 1, 0, 0);
- pl.RenderPass.End (cmd);
- cmd.End ();
-
- staggingQ.Submit (cmd);
- staggingQ.WaitIdle ();
-
- cmd.Free ();
- }
- }
- lutBrdf.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
- }
-
- public enum CBTarget { IRRADIANCE = 0, PREFILTEREDENV = 1 };
-
- public Image generateCubeMap (Queue staggingQ, CommandPool cmdPool, CBTarget target) {
- const float deltaPhi = (2.0f * (float)Math.PI) / 180.0f;
- const float deltaTheta = (0.5f * (float)Math.PI) / 64.0f;
-
- VkFormat format = VkFormat.R32g32b32a32Sfloat;
- uint dim = 64;
-
- if (target == CBTarget.PREFILTEREDENV) {
- format = VkFormat.R16g16b16a16Sfloat;
- dim = 512;
- }
-
- uint numMips = (uint)Math.Floor (Math.Log (dim, 2)) + 1;
-
- Image imgFbOffscreen = new Image (Dev, format, VkImageUsageFlags.TransferSrc | VkImageUsageFlags.ColorAttachment,
- VkMemoryPropertyFlags.DeviceLocal, dim, dim);
- imgFbOffscreen.SetName ("offscreenfb");
- imgFbOffscreen.CreateView ();
-
- Image cmap = new Image (Dev, format, VkImageUsageFlags.TransferDst | VkImageUsageFlags.Sampled,
- VkMemoryPropertyFlags.DeviceLocal, dim, dim, VkImageType.Image2D, VkSampleCountFlags.SampleCount1, VkImageTiling.Optimal,
- numMips, 6, 1, VkImageCreateFlags.CubeCompatible);
- if (target == CBTarget.PREFILTEREDENV)
- cmap.SetName ("prefilterenvmap");
- else
- cmap.SetName ("irradianceCube");
- cmap.CreateView (VkImageViewType.Cube, VkImageAspectFlags.Color, 6, 0);
- cmap.CreateSampler (VkSamplerAddressMode.ClampToEdge);
-
- DescriptorPool dsPool = new DescriptorPool (Dev, 2, new VkDescriptorPoolSize (VkDescriptorType.CombinedImageSampler));
-
- DescriptorSetLayout dsLayout = new DescriptorSetLayout (Dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler));
-
-
- GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, VkSampleCountFlags.SampleCount1, false);
- cfg.Layout = new PipelineLayout (Dev, dsLayout);
- cfg.Layout.AddPushConstants (
- new VkPushConstantRange (VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, (uint)Marshal.SizeOf<Matrix4x4> () + 8));
-
- cfg.RenderPass = new RenderPass (Dev);
- cfg.RenderPass.AddAttachment (format, VkImageLayout.ColorAttachmentOptimal);
- cfg.RenderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0, 0, 0) });
- cfg.RenderPass.AddSubpass (new SubPass (VkImageLayout.ColorAttachmentOptimal));
-
- cfg.AddVertexBinding (0, 3 * sizeof (float));
- cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat);
-
- cfg.AddShader (VkShaderStageFlags.Vertex, "#deferred.filtercube.vert.spv");
- if (target == CBTarget.PREFILTEREDENV)
- cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.prefilterenvmap.frag.spv");
- else
- cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.irradiancecube.frag.spv");
-
- Matrix4x4[] matrices = {
- // POSITIVE_X
- Matrix4x4.CreateRotationX(Utils.DegreesToRadians(180)) * Matrix4x4.CreateRotationY(Utils.DegreesToRadians(90)),
- // NEGATIVE_X
- Matrix4x4.CreateRotationX(Utils.DegreesToRadians(180)) * Matrix4x4.CreateRotationY(Utils.DegreesToRadians(-90)),
- // POSITIVE_Y
- Matrix4x4.CreateRotationX(Utils.DegreesToRadians(-90)),
- // NEGATIVE_Y
- Matrix4x4.CreateRotationX(Utils.DegreesToRadians(90)),
- // POSITIVE_Z
- Matrix4x4.CreateRotationX(Utils.DegreesToRadians(180)),
- // NEGATIVE_Z
- Matrix4x4.CreateRotationZ(Utils.DegreesToRadians(180))
- };
-
- VkImageSubresourceRange subRes = new VkImageSubresourceRange (VkImageAspectFlags.Color, 0, numMips, 0, 6);
-
- using (GraphicPipeline pl = new GraphicPipeline (cfg)) {
-
- DescriptorSet dset = dsPool.Allocate (dsLayout);
- DescriptorSetWrites dsUpdate = new DescriptorSetWrites (dsLayout);
- dsUpdate.Write (Dev, dset, cubemap.Descriptor);
- Dev.WaitIdle ();
-
- using (FrameBuffer fb = new FrameBuffer (pl.RenderPass, dim, dim, imgFbOffscreen)) {
- CommandBuffer cmd = cmdPool.AllocateCommandBuffer ();
- cmd.Start (VkCommandBufferUsageFlags.OneTimeSubmit);
-
- cmap.SetLayout (cmd, VkImageLayout.Undefined, VkImageLayout.TransferDstOptimal, subRes);
-
- float roughness = 0;
-
- cmd.SetScissor (dim, dim);
- cmd.SetViewport ((float)(dim), (float)dim);
-
- for (int m = 0; m < numMips; m++) {
- roughness = (float)m / ((float)numMips - 1f);
-
- for (int f = 0; f < 6; f++) {
- pl.RenderPass.Begin (cmd, fb);
-
- pl.Bind (cmd);
-
- float viewPortSize = (float)Math.Pow (0.5, m) * dim;
- cmd.SetViewport (viewPortSize, viewPortSize);
- cmd.PushConstant (pl.Layout, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment,
- matrices[f] * Matrix4x4.CreatePerspectiveFieldOfView (Utils.DegreesToRadians (90), 1f, 0.1f, 512f));
- if (target == CBTarget.IRRADIANCE) {
- cmd.PushConstant (pl.Layout, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, deltaPhi, (uint)Marshal.SizeOf<Matrix4x4> ());
- cmd.PushConstant (pl.Layout, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, deltaTheta, (uint)Marshal.SizeOf<Matrix4x4> () + 4);
- } else {
- cmd.PushConstant (pl.Layout, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, roughness, (uint)Marshal.SizeOf<Matrix4x4> ());
- cmd.PushConstant (pl.Layout, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, 64u, (uint)Marshal.SizeOf<Matrix4x4> () + 4);
- }
-
- cmd.BindDescriptorSet (pl.Layout, dset);
- cmd.BindVertexBuffer (vboSkybox);
- cmd.Draw (36);
-
- pl.RenderPass.End (cmd);
-
- imgFbOffscreen.SetLayout (cmd, VkImageAspectFlags.Color,
- VkImageLayout.ColorAttachmentOptimal, VkImageLayout.TransferSrcOptimal);
-
- VkImageCopy region = new VkImageCopy ();
- region.srcSubresource = new VkImageSubresourceLayers (VkImageAspectFlags.Color, 1);
- region.dstSubresource = new VkImageSubresourceLayers (VkImageAspectFlags.Color, 1, (uint)m, (uint)f);
- region.extent = new VkExtent3D { width = (uint)viewPortSize, height = (uint)viewPortSize, depth = 1 };
-
- Vk.vkCmdCopyImage (cmd.Handle,
- imgFbOffscreen.Handle, VkImageLayout.TransferSrcOptimal,
- cmap.Handle, VkImageLayout.TransferDstOptimal,
- 1, region.Pin ());
- region.Unpin ();
-
- imgFbOffscreen.SetLayout (cmd, VkImageAspectFlags.Color,
- VkImageLayout.TransferSrcOptimal, VkImageLayout.ColorAttachmentOptimal);
-
- }
- }
-
- cmap.SetLayout (cmd, VkImageLayout.TransferDstOptimal, VkImageLayout.ShaderReadOnlyOptimal, subRes);
-
- cmd.End ();
-
- staggingQ.Submit (cmd);
- staggingQ.WaitIdle ();
-
- cmd.Free ();
- }
- }
- cmap.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
-
- dsLayout.Dispose ();
- imgFbOffscreen.Dispose ();
- dsPool.Dispose ();
-
- return cmap;
- }
-
- void generateCubemaps (Queue staggingQ, CommandPool cmdPool) {
- irradianceCube = generateCubeMap (staggingQ, cmdPool, CBTarget.IRRADIANCE);
- prefilterCube = generateCubeMap (staggingQ, cmdPool, CBTarget.PREFILTEREDENV);
- }
-
- protected override void Dispose (bool disposing) {
- vboSkybox.Dispose ();
- cubemap.Dispose ();
- lutBrdf.Dispose ();
- irradianceCube.Dispose ();
- prefilterCube.Dispose ();
-
- base.Dispose (disposing);
- }
- }
-
-}
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
- <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
- <!-- <EnableDefaultNoneItems>false</EnableDefaultNoneItems> -->
+ <DefineConstants>$(DefineConstants);WITH_SHADOWS</DefineConstants>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <DefineConstants>TRACE;NETSTANDARD;NETSTANDARD2_0;MEMORY_POOLS;WITH_SHADOWS;_WITH_VKVG;DEBUG;NETFRAMEWORK;NET472</DefineConstants>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugCrow|AnyCPU' ">
- <DefineConstants>TRACE;DEBUG;NETSTANDARD;NETSTANDARD2_0;MEMORY_POOLS;WITH_SHADOWS;_WITH_VKVG</DefineConstants>
- </PropertyGroup>
- <ItemGroup>
- <Compile Include="DeferredPbrRenderer.cs;shadowMapRenderer.cs" />
- </ItemGroup>
- <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugCrow|AnyCPU' ">
- <Compile Include="main-crow.cs" />
- </ItemGroup>
- <ItemGroup Condition="$(Configuration) != 'DebugCrow' ">
- <Compile Include="main.cs" />
- </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\addons\gltfLoader\gltfLoader.csproj" />
<ProjectReference Include="..\..\addons\EnvironmentPipeline\EnvironmentPipeline.csproj" />
+++ /dev/null
-using System;
-using System.Numerics;
-using Glfw;
-using Vulkan;
-using vke;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace deferred {
- class Program : Crow.CrowWin {
- static void Main (string[] args) {
-#if DEBUG
- Instance.VALIDATION = true;
- Instance.DEBUG_UTILS = true;
- Instance.RENDER_DOC_CAPTURE = false;
-#endif
- DeferredPbrRenderer.TEXTURE_ARRAY = true;
- DeferredPbrRenderer.NUM_SAMPLES = VkSampleCountFlags.SampleCount1;
- DeferredPbrRenderer.HDR_FORMAT = VkFormat.R32g32b32a32Sfloat;
- DeferredPbrRenderer.MRT_FORMAT = VkFormat.R16g16b16a16Sfloat;
-
- PbrModelTexArray.TEXTURE_DIM = 1024;
-
- using (Program vke = new Program ()) {
- vke.Run ();
- }
- }
-
- #region crow ui
- public Crow.Command CMDViewScenes, CMDViewEditor, CMDViewDebug, CMDViewMaterials;
- void init_crow_commands () {
- CMDViewScenes = new Crow.Command (new Action (() => loadWindow ("#deferred.main.crow", this))) { Caption = "Lighting", Icon = new Crow.SvgPicture ("#deferred.crow.svg"), CanExecute = true };
- CMDViewEditor = new Crow.Command (new Action (() => loadWindow ("#deferred.scenes.crow", this))) { Caption = "Scenes", Icon = new Crow.SvgPicture ("#deferred.crow.svg"), CanExecute = true };
- CMDViewDebug = new Crow.Command (new Action (() => loadWindow ("#deferred.debug.crow", this))) { Caption = "Debug", Icon = new Crow.SvgPicture ("#deferred.crow.svg"), CanExecute = true };
- CMDViewMaterials = new Crow.Command (new Action (() => loadWindow ("#deferred.materials.crow", this))) { Caption = "Materials", Icon = new Crow.SvgPicture ("#deferred.crow.svg"), CanExecute = true };
- }
-
- public DeferredPbrRenderer.DebugView CurrentDebugView {
- get { return renderer.currentDebugView; }
- set {
- if (value == renderer.currentDebugView)
- return;
- lock(crow.UpdateMutex)
- renderer.currentDebugView = value;
- rebuildBuffers = true;
- NotifyValueChanged ("CurrentDebugView", renderer.currentDebugView);
- }
- }
-
- public float Gamma {
- get { return renderer.matrices.gamma; }
- set {
- if (value == renderer.matrices.gamma)
- return;
- renderer.matrices.gamma = value;
- NotifyValueChanged ("Gamma", value);
- updateViewRequested = true;
- }
- }
- public float Exposure {
- get { return renderer.matrices.exposure; }
- set {
- if (value == renderer.matrices.exposure)
- return;
- renderer.matrices.exposure = value;
- NotifyValueChanged ("Exposure", value);
- updateViewRequested = true;
- }
- }
- public float LightStrength {
- get { return renderer.lights[renderer.lightNumDebug].color.X; }
- set {
- if (value == renderer.lights[renderer.lightNumDebug].color.X)
- return;
- renderer.lights[renderer.lightNumDebug].color = new Vector4(value);
- NotifyValueChanged ("LightStrength", value);
- renderer.uboLights.Update (renderer.lights);
- }
- }
- public List<DeferredPbrRenderer.Light> Lights => renderer.lights.ToList ();
- public List<Model.Scene> Scenes => renderer.model.Scenes;
- #endregion
-
- public override string[] EnabledDeviceExtensions => new string[] {
- Ext.D.VK_KHR_swapchain,
- Ext.D.VK_EXT_debug_marker
- };
-
- protected override void configureEnabledFeatures (VkPhysicalDeviceFeatures available_features, ref VkPhysicalDeviceFeatures features) {
- base.configureEnabledFeatures (available_features, ref features);
-
- features.samplerAnisotropy = available_features.samplerAnisotropy;
- features.sampleRateShading = available_features.sampleRateShading;
- features.geometryShader = available_features.geometryShader;
- features.pipelineStatisticsQuery = true;
-
- if (available_features.textureCompressionETC2) {
- features.textureCompressionETC2 = true;
- Image.DefaultTextureFormat = VkFormat.Etc2R8g8b8a8UnormBlock;
- }else if (available_features.textureCompressionBC) {
- //features.textureCompressionBC = true;
- //Image.DefaultTextureFormat = VkFormat.Bc3UnormBlock;
- }
-
-
- }
-
- protected override void createQueues () {
- base.createQueues ();
- transferQ = new Queue (dev, VkQueueFlags.Transfer);
- }
-
- string[] cubemapPathes = {
- Utils.DataDirectory + "textures/papermill.ktx",
- Utils.DataDirectory + "textures/cubemap_yokohama_bc3_unorm.ktx",
- Utils.DataDirectory + "textures/gcanyon_cube.ktx",
- Utils.DataDirectory + "textures/pisa_cube.ktx",
- Utils.DataDirectory + "textures/uffizi_cube.ktx",
- };
- string[] modelPathes = {
- //"/mnt/devel/gts/vkChess.net/data/models/chess.glb",
- //"/home/jp/gltf/jaguar/scene.gltf",
- Utils.DataDirectory + "models/DamagedHelmet/glTF/DamagedHelmet.gltf",
- Utils.DataDirectory + "models/shadow.glb",
- Utils.DataDirectory + "models/Hubble.glb",
- Utils.DataDirectory + "models/MER_static.glb",
- Utils.DataDirectory + "models/ISS_stationary.glb",
- };
-
- int curModelIndex = 0;
- bool reloadModel;
-
- Queue transferQ;
- DeferredPbrRenderer renderer;
- PipelineStatisticsQueryPool statPool;
- TimestampQueryPool timestampQPool;
- ulong[] results;
-
- DebugReport dbgRepport;
-
- protected override void initVulkan () {
- base.initVulkan ();
-
-#if DEBUG
- dbgRepport = new DebugReport (instance,
- VkDebugReportFlagsEXT.ErrorEXT
- | VkDebugReportFlagsEXT.DebugEXT
- | VkDebugReportFlagsEXT.WarningEXT
- | VkDebugReportFlagsEXT.PerformanceWarningEXT
- );
-#endif
-
- camera = new Camera (Utils.DegreesToRadians (45f), 1f, 0.1f, 16f);
- camera.SetPosition (0, 0, 2);
-
- renderer = new DeferredPbrRenderer (dev, swapChain, presentQueue, cubemapPathes[2], camera.NearPlane, camera.FarPlane);
- renderer.LoadModel (transferQ, modelPathes[curModelIndex]);
- camera.Model = Matrix4x4.CreateScale (1f / Math.Max (Math.Max (renderer.modelAABB.Width, renderer.modelAABB.Height), renderer.modelAABB.Depth));
-
- statPool = new PipelineStatisticsQueryPool (dev,
- VkQueryPipelineStatisticFlags.InputAssemblyVertices |
- VkQueryPipelineStatisticFlags.InputAssemblyPrimitives |
- VkQueryPipelineStatisticFlags.ClippingInvocations |
- VkQueryPipelineStatisticFlags.ClippingPrimitives |
- VkQueryPipelineStatisticFlags.FragmentShaderInvocations);
-
- timestampQPool = new TimestampQueryPool (dev);
-
- init_crow_commands ();
-
- crow.Load ("#deferred.menu.crow").DataSource = this;
-
- }
-
- protected override void recordDraw (PrimaryCommandBuffer cmd, int imageIndex) {
- statPool.Begin (cmd);
- renderer.buildCommandBuffers (cmd, imageIndex);
- statPool.End (cmd);
- }
-
- public override void UpdateView () {
- renderer.UpdateView (camera);
- updateViewRequested = false;
-#if WITH_SHADOWS
- if (renderer.shadowMapRenderer.updateShadowMap)
- renderer.shadowMapRenderer.update_shadow_map (cmdPool);
-#endif
- }
-
- int frameCount = 0;
- public override void Update () {
- if (reloadModel) {
- renderer.LoadModel (transferQ, modelPathes[curModelIndex]);
- reloadModel = false;
- camera.Model = Matrix4x4.CreateScale (1f / Math.Max (Math.Max (renderer.modelAABB.Width, renderer.modelAABB.Height), renderer.modelAABB.Depth));
- updateViewRequested = true;
- rebuildBuffers = true;
-#if WITH_SHADOWS
- renderer.shadowMapRenderer.updateShadowMap = true;
-#endif
- }
-
- base.Update ();
-
- if (++frameCount > 20) {
- NotifyValueChanged ("fps", fps);
- frameCount = 0;
- }
-
- results = statPool.GetResults ();
- }
- protected override void OnResize () {
- renderer.Resize ();
- base.OnResize ();
- }
-
- #region Mouse and keyboard
- protected override void onMouseMove (double xPos, double yPos) {
- if (crow.ProcessMouseMove ((int)xPos, (int)yPos))
- return;
-
- double diffX = lastMouseX - xPos;
- double diffY = lastMouseY - yPos;
- if (MouseButton[0]) {
- camera.Rotate ((float)-diffX, (float)-diffY);
- } else if (MouseButton[1]) {
- camera.SetZoom ((float)diffY);
- } else
- return;
-
- updateViewRequested = true;
- }
- protected override void onMouseButtonDown (Glfw.MouseButton button) {
- if (crow.ProcessMouseButtonDown ((Crow.MouseButton)button))
- return;
- base.onMouseButtonDown (button);
- }
- protected override void onMouseButtonUp (Glfw.MouseButton button) {
- if (crow.ProcessMouseButtonUp ((Crow.MouseButton)button))
- return;
- base.onMouseButtonUp (button);
- }
- protected override void onKeyDown (Key key, int scanCode, Modifier modifiers) {
- if (crow.ProcessKeyDown ((Crow.Key)key))
- return;
- switch (key) {
- case Key.F:
- if (modifiers.HasFlag (Modifier.Shift)) {
- renderer.debugFace--;
- if (renderer.debugFace < 0)
- renderer.debugFace = 5;
- } else {
- renderer.debugFace++;
- if (renderer.debugFace >= 5)
- renderer.debugFace = 0;
- }
- rebuildBuffers = true;
- break;
- case Key.M:
- if (modifiers.HasFlag (Modifier.Shift)) {
- renderer.debugMip--;
- if (renderer.debugMip < 0)
- renderer.debugMip = (int)renderer.envCube.prefilterCube.CreateInfo.mipLevels - 1;
- } else {
- renderer.debugMip++;
- if (renderer.debugMip >= renderer.envCube.prefilterCube.CreateInfo.mipLevels)
- renderer.debugMip = 0;
- }
- rebuildBuffers = true;
- break;
- case Key.L:
- if (modifiers.HasFlag (Modifier.Shift)) {
- renderer.lightNumDebug--;
- if (renderer.lightNumDebug < 0)
- renderer.lightNumDebug = (int)renderer.lights.Length - 1;
- } else {
- renderer.lightNumDebug++;
- if (renderer.lightNumDebug >= renderer.lights.Length)
- renderer.lightNumDebug = 0;
- }
- rebuildBuffers = true;
- break;
- case Key.Keypad0:
- case Key.Keypad1:
- case Key.Keypad2:
- case Key.Keypad3:
- case Key.Keypad4:
- case Key.Keypad5:
- case Key.Keypad6:
- case Key.Keypad7:
- case Key.Keypad8:
- case Key.Keypad9:
- renderer.currentDebugView = (DeferredPbrRenderer.DebugView)(int)key-320;
- rebuildBuffers = true;
- break;
- case Key.KeypadDivide:
- renderer.currentDebugView = DeferredPbrRenderer.DebugView.irradiance;
- rebuildBuffers = true;
- break;
- case Key.S:
- if (modifiers.HasFlag (Modifier.Control)) {
- renderer.pipelineCache.Save ();
- Console.WriteLine ($"Pipeline Cache saved.");
- } else {
- renderer.currentDebugView = DeferredPbrRenderer.DebugView.shadowMap;
- rebuildBuffers = true;
- }
- break;
- case Key.Up:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight(-Vector4.UnitZ);
- else
- camera.Move (0, 0, 1);
- break;
- case Key.Down:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight (Vector4.UnitZ);
- else
- camera.Move (0, 0, -1);
- break;
- case Key.Left:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight (-Vector4.UnitX);
- else
- camera.Move (1, 0, 0);
- break;
- case Key.Right:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight (Vector4.UnitX);
- else
- camera.Move (-1, 0, 0);
- break;
- case Key.PageUp:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight (Vector4.UnitY);
- else
- camera.Move (0, 1, 0);
- break;
- case Key.PageDown:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight (-Vector4.UnitY);
- else
- camera.Move (0, -1, 0);
- break;
- case Key.F2:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.matrices.exposure -= 0.3f;
- else
- renderer.matrices.exposure += 0.3f;
- break;
- case Key.F3:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.matrices.gamma -= 0.1f;
- else
- renderer.matrices.gamma += 0.1f;
- break;
- case Key.F4:
- if (camera.Type == Camera.CamType.FirstPerson)
- camera.Type = Camera.CamType.LookAt;
- else
- camera.Type = Camera.CamType.FirstPerson;
- Console.WriteLine ($"camera type = {camera.Type}");
- break;
- case Key.KeypadAdd:
- curModelIndex++;
- if (curModelIndex >= modelPathes.Length)
- curModelIndex = 0;
- reloadModel = true;
- break;
- case Key.KeypadSubtract:
- curModelIndex--;
- if (curModelIndex < 0)
- curModelIndex = modelPathes.Length -1;
- reloadModel = true;
- break;
- default:
- base.onKeyDown (key, scanCode, modifiers);
- return;
- }
- updateViewRequested = true;
- }
- protected override void onKeyUp (Key key, int scanCode, Modifier modifiers) {
- if (crow.ProcessKeyUp ((Crow.Key)key))
- return;
- }
- protected override void onChar (CodePoint cp) {
- if (crow.ProcessKeyPress (cp.ToChar ()))
- return;
- }
- #endregion
-
- protected override void Dispose (bool disposing) {
- if (disposing) {
- if (!isDisposed) {
- renderer.Dispose ();
- statPool.Dispose ();
- timestampQPool.Dispose ();
- dbgRepport?.Dispose ();
- }
- }
-
- base.Dispose (disposing);
- }
- }
-}
static void Main (string[] args) {
#if DEBUG
Instance.VALIDATION = true;
- Instance.RENDER_DOC_CAPTURE = true;
+ Instance.RENDER_DOC_CAPTURE = false;
#endif
SwapChain.PREFERED_FORMAT = VkFormat.B8g8r8a8Srgb;
DeferredPbrRenderer.TEXTURE_ARRAY = true;
- DeferredPbrRenderer.NUM_SAMPLES = VkSampleCountFlags.SampleCount8;
+ DeferredPbrRenderer.NUM_SAMPLES = VkSampleCountFlags.SampleCount1;
DeferredPbrRenderer.HDR_FORMAT = VkFormat.R32g32b32a32Sfloat;
DeferredPbrRenderer.MRT_FORMAT = VkFormat.R32g32b32a32Sfloat;
Ext.I.VK_EXT_debug_utils,
};
- public override string[] EnabledDeviceExtensions => new string[] {
- Ext.D.VK_KHR_swapchain,
- };
protected override void configureEnabledFeatures (VkPhysicalDeviceFeatures available_features, ref VkPhysicalDeviceFeatures enabled_features) {
base.configureEnabledFeatures (available_features, ref enabled_features);
//Utils.DataDirectory + "models/Box.gltf",
//Utils.DataDirectory + "models/cubeOnPlane.glb",
//Utils.DataDirectory + "models/shadow.glb",
- Utils.DataDirectory + "models/cube.gltf",
+ //Utils.DataDirectory + "models/cube.gltf",
Utils.DataDirectory + "models/DamagedHelmet/glTF/DamagedHelmet.gltf",
//Utils.DataDirectory + "models/shadow.glb",
Utils.DataDirectory + "models/Hubble.glb",
+++ /dev/null
-using System;
-using System.Collections.Generic;
-using System.Numerics;
-using System.Runtime.InteropServices;
-using Glfw;
-using VK;
-using CVKL;
-
-namespace deferredShadow {
- class Program : VkWindow{
- static void Main (string[] args) {
- using (Program vke = new Program ()) {
- vke.Run ();
- }
- }
-
- VkSampleCountFlags samples = VkSampleCountFlags.SampleCount1;
-
- public struct Matrices {
- public Matrix4x4 projection;
- public Matrix4x4 view;
- public Matrix4x4 model;
- public Vector4 lightPos;
- public float gamma;
- public float exposure;
- }
-
- public Matrices matrices = new Matrices {
- lightPos = new Vector4 (1.0f, 0.0f, 0.0f, 1.0f),
- gamma = 1.0f,
- exposure = 2.0f,
- };
-
- const uint SHADOW_MAP_SIZE = 4096;
-
-#if DEBUG
- PipelineStatisticsQueryPool statPool;
- TimestampQueryPool timestampQPool;
- ulong[] results;
-#endif
-
- protected override void configureEnabledFeatures (ref VkPhysicalDeviceFeatures features) {
- base.configureEnabledFeatures (ref features);
-#if DEBUG
- features.pipelineStatisticsQuery = true;
-#endif
- }
-
- Program () : base(true) {
- //camera.Model = Matrix4x4.CreateRotationX (Utils.DegreesToRadians (-90)) * Matrix4x4.CreateRotationY (Utils.DegreesToRadians (180));
- //camera.SetRotation (-0.1f,-0.4f);
- camera.SetPosition (0, 0, -3);
-
- init ();
-
-#if DEBUG
- statPool = new PipelineStatisticsQueryPool (dev,
- VkQueryPipelineStatisticFlags.InputAssemblyVertices |
- VkQueryPipelineStatisticFlags.InputAssemblyPrimitives |
- VkQueryPipelineStatisticFlags.ClippingInvocations |
- VkQueryPipelineStatisticFlags.ClippingPrimitives |
- VkQueryPipelineStatisticFlags.FragmentShaderInvocations);
-
- timestampQPool = new TimestampQueryPool (dev);
-#endif
- }
-
- Framebuffer[] frameBuffers;
- Image gbColorRough, gbEmitMetal, gbN, gbPos;
-
- DescriptorPool descriptorPool;
- DescriptorSetLayout descLayoutMain, descLayoutModelTextures, descLayoutGBuff;
- DescriptorSet dsMain, dsGBuff;
-
- Pipeline gBuffPipeline, composePipeline;
-
- HostBuffer uboMats;
-
- RenderPass renderPass;
-
- Model model;
- EnvironmentCube envCube;
-
- DebugDrawPipeline debugDraw;
- Framebuffer[] debugFB;
-
- void init () {
- VkFormat depthFormat = dev.GetSuitableDepthFormat ();
- renderPass = new RenderPass (dev);
-
- renderPass.AddAttachment (swapChain.ColorFormat, VkImageLayout.ColorAttachmentOptimal, VkSampleCountFlags.SampleCount1);
- renderPass.AddAttachment (depthFormat, VkImageLayout.DepthStencilAttachmentOptimal, samples);
- renderPass.AddAttachment (VkFormat.R8g8b8a8Unorm, VkImageLayout.ColorAttachmentOptimal);
- renderPass.AddAttachment (VkFormat.R8g8b8a8Unorm, VkImageLayout.ColorAttachmentOptimal);
- renderPass.AddAttachment (VkFormat.R16g16b16a16Sfloat, VkImageLayout.ColorAttachmentOptimal);
- renderPass.AddAttachment (VkFormat.R16g16b16a16Sfloat, VkImageLayout.ColorAttachmentOptimal);
- //renderPass.AddAttachment (VkFormat.R16g16b16a16Sfloat, VkImageLayout.DepthStencilReadOnlyOptimal);
-
- renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
- renderPass.ClearValues.Add (new VkClearValue { depthStencil = new VkClearDepthStencilValue (1.0f, 0) });
- renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
- renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
- renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
- renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
-
- SubPass[] subpass = { new SubPass (), new SubPass (), new SubPass() };
- subpass[0].AddColorReference ( new VkAttachmentReference (2, VkImageLayout.ColorAttachmentOptimal),
- new VkAttachmentReference (3, VkImageLayout.ColorAttachmentOptimal),
- new VkAttachmentReference (4, VkImageLayout.ColorAttachmentOptimal),
- new VkAttachmentReference (5, VkImageLayout.ColorAttachmentOptimal));
- subpass[0].SetDepthReference (1, VkImageLayout.DepthStencilAttachmentOptimal);
-
- subpass[1].AddColorReference (0, VkImageLayout.ColorAttachmentOptimal);
- subpass[1].AddInputReference ( new VkAttachmentReference (2, VkImageLayout.ShaderReadOnlyOptimal),
- new VkAttachmentReference (3, VkImageLayout.ShaderReadOnlyOptimal),
- new VkAttachmentReference (4, VkImageLayout.ShaderReadOnlyOptimal),
- new VkAttachmentReference (5, VkImageLayout.ShaderReadOnlyOptimal));
- renderPass.AddSubpass (subpass);
-
- renderPass.AddDependency (Vk.SubpassExternal, 0,
- VkPipelineStageFlags.BottomOfPipe, VkPipelineStageFlags.ColorAttachmentOutput,
- VkAccessFlags.MemoryRead, VkAccessFlags.ColorAttachmentRead | VkAccessFlags.ColorAttachmentWrite);
- renderPass.AddDependency (0, 1,
- VkPipelineStageFlags.ColorAttachmentOutput, VkPipelineStageFlags.FragmentShader,
- VkAccessFlags.ColorAttachmentWrite, VkAccessFlags.ShaderRead);
- renderPass.AddDependency (1, Vk.SubpassExternal,
- VkPipelineStageFlags.ColorAttachmentOutput, VkPipelineStageFlags.BottomOfPipe,
- VkAccessFlags.ColorAttachmentRead | VkAccessFlags.ColorAttachmentWrite, VkAccessFlags.MemoryRead);
-
-
- descriptorPool = new DescriptorPool (dev, 3,
- new VkDescriptorPoolSize (VkDescriptorType.UniformBuffer, 2),
- new VkDescriptorPoolSize (VkDescriptorType.CombinedImageSampler, 3),
- new VkDescriptorPoolSize (VkDescriptorType.InputAttachment, 4)
- );
-
- descLayoutMain = new DescriptorSetLayout (dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, VkDescriptorType.UniformBuffer),
- new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (2, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (3, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler));
-
- descLayoutModelTextures = new DescriptorSetLayout (dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (2, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (3, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (4, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler)
- );
-
- descLayoutGBuff = new DescriptorSetLayout (dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.InputAttachment),
- new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.InputAttachment),
- new VkDescriptorSetLayoutBinding (2, VkShaderStageFlags.Fragment, VkDescriptorType.InputAttachment),
- new VkDescriptorSetLayoutBinding (3, VkShaderStageFlags.Fragment, VkDescriptorType.InputAttachment));
-
- dsMain = descriptorPool.Allocate (descLayoutMain);
- dsGBuff = descriptorPool.Allocate (descLayoutGBuff);
-
- GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, samples);
- cfg.Layout = new PipelineLayout (dev, descLayoutMain, descLayoutModelTextures, descLayoutGBuff);
- cfg.Layout.AddPushConstants (
- new VkPushConstantRange (VkShaderStageFlags.Vertex, (uint)Marshal.SizeOf<Matrix4x4> ()),
- new VkPushConstantRange (VkShaderStageFlags.Fragment, (uint)Marshal.SizeOf<Model.PbrMaterial> (), 64)
- );
- cfg.RenderPass = renderPass;
- cfg.blendAttachments.Add (new VkPipelineColorBlendAttachmentState (false));
- cfg.blendAttachments.Add (new VkPipelineColorBlendAttachmentState (false));
- cfg.blendAttachments.Add (new VkPipelineColorBlendAttachmentState (false));
-
- cfg.AddVertexBinding<Model.Vertex> (0);
- cfg.SetVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32b32Sfloat, VkFormat.R32g32Sfloat);
- cfg.AddShader (VkShaderStageFlags.Vertex, "shaders/pbrtest.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "shaders/GBuffPbr.frag.spv");
-
- gBuffPipeline = new GraphicPipeline (cfg);
- cfg.blendAttachments.Clear ();
- cfg.blendAttachments.Add (new VkPipelineColorBlendAttachmentState (false));
- cfg.ResetShadersAndVerticesInfos ();
- cfg.SubpassIndex = 1;
- cfg.Layout = gBuffPipeline.Layout;
- cfg.depthStencilState.depthTestEnable = false;
- cfg.depthStencilState.depthWriteEnable = false;
- cfg.AddShader (VkShaderStageFlags.Vertex, "shaders/FullScreenQuad.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "shaders/pbrtest.frag.spv");
- composePipeline = new GraphicPipeline (cfg);
-
- envCube = new EnvironmentCube (presentQueue, renderPass);
-
- uboMats = new HostBuffer (dev, VkBufferUsageFlags.UniformBuffer, (ulong)Marshal.SizeOf<Matrices> () * 2);
- uboMats.Map ();//permanent map
-
- DescriptorSetWrites uboUpdate = new DescriptorSetWrites (descLayoutMain);
- uboUpdate.Write (dev, dsMain, uboMats.Descriptor,
- envCube.lutBrdf.Descriptor,
- envCube.irradianceCube.Descriptor,
- envCube.prefilterCube.Descriptor);
- uboMats.Descriptor.offset = (ulong)Marshal.SizeOf<Matrices> ();
- envCube.WriteDesc (uboMats.Descriptor);
-#if DEBUG
- debugDraw = new DebugDrawPipeline (dev, descLayoutMain, swapChain.ColorFormat);
- debugDraw.AddLine (Vector3.Zero, new Vector3(matrices.lightPos.X,matrices.lightPos.Y,matrices.lightPos.Z)*3, 1, 1, 1);
- debugDraw.AddLine (Vector3.Zero, Vector3.UnitX, 1, 0, 0);
- debugDraw.AddLine (Vector3.Zero, Vector3.UnitY, 0, 1, 0);
- debugDraw.AddLine (Vector3.Zero, Vector3.UnitZ, 0, 0, 1);
-#endif
-
-
- model = new Model (presentQueue, "../data/models/DamagedHelmet/glTF/DamagedHelmet.gltf");
- //model = new Model (presentQueue, "../data/models/chess.gltf");
- //model = new Model (presentQueue, "../data/models/Sponza/glTF/Sponza.gltf");
- //model = new Model (dev, presentQueue, "../data/models/icosphere.gltf");
- //model = new Model (dev, presentQueue, cmdPool, "../data/models/cube.gltf");
- model.WriteMaterialsDescriptorSets (descLayoutModelTextures,
- VK.AttachmentType.Color,
- VK.AttachmentType.Normal,
- VK.AttachmentType.AmbientOcclusion,
- VK.AttachmentType.PhysicalProps,
- VK.AttachmentType.Emissive);
- }
-
- void buildCommandBuffers () {
- for (int i = 0; i < swapChain.ImageCount; ++i) {
- cmds[i]?.Free ();
- cmds[i] = cmdPool.AllocateCommandBuffer ();
- cmds[i].Start ();
-
-#if DEBUG
- statPool.Begin (cmds[i]);
- recordDraw (cmds[i], frameBuffers[i]);
- statPool.End (cmds[i]);
-
- debugDraw.RecordDraw (cmds[i], debugFB[i], camera);
-#else
- recordDraw (cmds[i], frameBuffers[i]);
-#endif
-
- cmds[i].End ();
- }
- }
- void recordDraw (CommandBuffer cmd, Framebuffer fb) {
- renderPass.Begin (cmd, fb);
-
- cmd.SetViewport (fb.Width, fb.Height);
- cmd.SetScissor (fb.Width, fb.Height);
-
- cmd.BindDescriptorSet (gBuffPipeline.Layout, dsMain);
- gBuffPipeline.Bind (cmd);
- model.Bind (cmd);
- model.DrawAll (cmd, gBuffPipeline.Layout);
-
- renderPass.BeginSubPass (cmd);
-
- cmd.BindDescriptorSet (composePipeline.Layout, dsGBuff, 2);
- composePipeline.Bind (cmd);
-
- cmd.Draw (3, 1, 0, 0);
-
- renderPass.End (cmd);
- }
-
-#region update
- void updateMatrices () {
- camera.AspectRatio = (float)swapChain.Width / swapChain.Height;
-
- matrices.projection = camera.Projection;
- matrices.view = camera.View;
- matrices.model = camera.Model;
- uboMats.Update (matrices, (uint)Marshal.SizeOf<Matrices> ());
- matrices.view *= Matrix4x4.CreateTranslation (-matrices.view.Translation);
- matrices.model = Matrix4x4.Identity;
- uboMats.Update (matrices, (uint)Marshal.SizeOf<Matrices> (), (uint)Marshal.SizeOf<Matrices> ());
- }
-
- public override void UpdateView () {
- updateMatrices ();
- updateViewRequested = false;
- }
- public override void Update () {
-#if DEBUG
- results = statPool.GetResults ();
-#endif
- }
-#endregion
-
-
-
- void createGBuff () {
- gbColorRough?.Dispose ();
- gbEmitMetal?.Dispose ();
- gbN?.Dispose ();
- gbPos?.Dispose ();
-
- gbColorRough = new Image (dev, VkFormat.R8g8b8a8Unorm, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment, VkMemoryPropertyFlags.DeviceLocal, swapChain.Width, swapChain.Height);
- gbEmitMetal = new Image (dev, VkFormat.R8g8b8a8Unorm, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment, VkMemoryPropertyFlags.DeviceLocal, swapChain.Width, swapChain.Height);
- gbN = new Image (dev, VkFormat.R16g16b16a16Sfloat, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment, VkMemoryPropertyFlags.DeviceLocal, swapChain.Width, swapChain.Height);
- gbPos = new Image (dev, VkFormat.R16g16b16a16Sfloat, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment, VkMemoryPropertyFlags.DeviceLocal, swapChain.Width, swapChain.Height);
-
- gbColorRough.CreateView ();
- gbColorRough.CreateSampler ();
- gbEmitMetal.CreateView ();
- gbEmitMetal.CreateSampler ();
- gbN.CreateView ();
- gbN.CreateSampler ();
- gbPos.CreateView ();
- gbPos.CreateSampler ();
-
- DescriptorSetWrites uboUpdate = new DescriptorSetWrites (descLayoutGBuff);
- uboUpdate.Write (dev, dsGBuff, gbColorRough.Descriptor,
- gbEmitMetal.Descriptor,
- gbN.Descriptor,
- gbPos.Descriptor);
- gbColorRough.SetName ("GBuffColorRough");
- gbEmitMetal.SetName ("GBuffEmitMetal");
- gbN.SetName ("GBuffN");
- gbPos.SetName ("GBuffPos");
- }
-
- protected override void OnResize () {
- updateMatrices ();
-
- if (frameBuffers != null)
- for (int i = 0; i < swapChain.ImageCount; ++i)
- frameBuffers[i]?.Dispose ();
-#if DEBUG
- if (debugFB != null)
- for (int i = 0; i < swapChain.ImageCount; ++i)
- debugFB[i]?.Dispose ();
-#endif
-
- createGBuff ();
-
- frameBuffers = new Framebuffer[swapChain.ImageCount];
- debugFB = new Framebuffer[swapChain.ImageCount];
-
- for (int i = 0; i < swapChain.ImageCount; ++i) {
- frameBuffers[i] = new Framebuffer (renderPass, swapChain.Width, swapChain.Height, new Image[] {
- swapChain.images[i], null, gbColorRough, gbEmitMetal, gbN, gbPos});
-#if DEBUG
- debugFB[i] = new Framebuffer (debugDraw.RenderPass, swapChain.Width, swapChain.Height,(debugDraw.Samples == VkSampleCountFlags.SampleCount1)
- ? new Image[] { swapChain.images[i] } : new Image[] { null, swapChain.images[i] });
- debugFB[i].SetName ("main FB " + i);
-#endif
- }
-
- buildCommandBuffers ();
- }
-
-
- #region Mouse and keyboard
- protected override void onKeyDown (Key key, int scanCode, Modifier modifiers) {
- switch (key) {
- case Key.F1:
- if (modifiers.HasFlag (Modifier.Shift))
- matrices.exposure -= 0.3f;
- else
- matrices.exposure += 0.3f;
- break;
- case Key.F2:
- if (modifiers.HasFlag (Modifier.Shift))
- matrices.gamma -= 0.1f;
- else
- matrices.gamma += 0.1f;
- break;
- case Key.F3:
- if (camera.Type == Camera.CamType.FirstPerson)
- camera.Type = Camera.CamType.LookAt;
- else
- camera.Type = Camera.CamType.FirstPerson;
- Console.WriteLine ($"camera type = {camera.Type}");
- break;
- default:
- base.onKeyDown (key, scanCode, modifiers);
- return;
- }
- updateViewRequested = true;
- }
-#endregion
-
- protected override void Dispose (bool disposing) {
- if (disposing) {
- if (!isDisposed) {
- dev.WaitIdle ();
- for (int i = 0; i < swapChain.ImageCount; ++i)
- frameBuffers[i]?.Dispose ();
-
- gbColorRough.Dispose ();
- gbEmitMetal.Dispose ();
- gbN.Dispose ();
- gbPos.Dispose ();
-
- gBuffPipeline.Dispose ();
- composePipeline.Dispose ();
-
- descLayoutMain.Dispose ();
- descLayoutModelTextures.Dispose ();
- descLayoutGBuff.Dispose ();
-
- uboMats.Dispose ();
- model.Dispose ();
- envCube.Dispose ();
-
- descriptorPool.Dispose ();
-#if DEBUG
- debugDraw.Dispose ();
- timestampQPool?.Dispose ();
- statPool?.Dispose ();
-#endif
- }
- }
-
- base.Dispose (disposing);
- }
- }
-}
+++ /dev/null
-using System;
-using System.Numerics;
-using System.Runtime.InteropServices;
-using Glfw;
-using VK;
-using CVKL;
-
-namespace deferredDebug {
- class Program : VkWindow{
- static void Main (string[] args) {
- using (Program vke = new Program ()) {
- vke.Run ();
- }
- }
-
- VkSampleCountFlags samples = VkSampleCountFlags.SampleCount1;
-
- public struct Matrices {
- public Matrix4x4 projection;
- public Matrix4x4 view;
- public Matrix4x4 model;
- public Vector4 lightPos;
- public float gamma;
- public float exposure;
- }
-
- public Matrices matrices = new Matrices {
- lightPos = new Vector4 (1.0f, 0, 0, 1.0f),
- gamma = 1.0f,
- exposure = 2.0f,
- };
-
-#if DEBUG
- PipelineStatisticsQueryPool statPool;
- TimestampQueryPool timestampQPool;
- ulong[] results;
-#endif
-
- protected override void configureEnabledFeatures (ref VkPhysicalDeviceFeatures features) {
- base.configureEnabledFeatures (ref features);
-#if DEBUG
- features.pipelineStatisticsQuery = true;
-#endif
- }
-
- Program () : base(true) {
- camera.Model = Matrix4x4.CreateRotationX (Utils.DegreesToRadians (-90)) * Matrix4x4.CreateRotationY (Utils.DegreesToRadians (180));
- camera.SetRotation (-0.1f,-0.4f);
- camera.SetPosition (0, 0, -3);
-
- init ();
-
-#if DEBUG
- statPool = new PipelineStatisticsQueryPool (dev,
- VkQueryPipelineStatisticFlags.InputAssemblyVertices |
- VkQueryPipelineStatisticFlags.InputAssemblyPrimitives |
- VkQueryPipelineStatisticFlags.ClippingInvocations |
- VkQueryPipelineStatisticFlags.ClippingPrimitives |
- VkQueryPipelineStatisticFlags.FragmentShaderInvocations);
-
- timestampQPool = new TimestampQueryPool (dev);
-#endif
- }
-
- Framebuffer[] frameBuffers;
- Image gbColorRough, gbEmitMetal, gbN, gbPos;
-
- DescriptorPool descriptorPool;
- DescriptorSetLayout descLayoutMain, descLayoutModelTextures, descLayoutGBuff;
- DescriptorSet dsMain, dsGBuff;
-
- Pipeline gBuffPipeline, composePipeline;
-
- HostBuffer uboMats;
-
- RenderPass renderPass;
-
- Model model;
- EnvironmentCube envCube;
-
- DebugDrawPipeline debugDraw;
- Framebuffer[] debugFB;
-
- void init () {
- renderPass = new RenderPass (dev);
- renderPass.AddAttachment (swapChain.ColorFormat, VkImageLayout.ColorAttachmentOptimal, VkSampleCountFlags.SampleCount1);
- renderPass.AddAttachment (dev.GetSuitableDepthFormat(), VkImageLayout.DepthStencilAttachmentOptimal, samples);
- renderPass.AddAttachment (VkFormat.R8g8b8a8Unorm, VkImageLayout.ColorAttachmentOptimal);
- renderPass.AddAttachment (VkFormat.R8g8b8a8Unorm, VkImageLayout.ColorAttachmentOptimal);
- renderPass.AddAttachment (VkFormat.R16g16b16a16Sfloat, VkImageLayout.ColorAttachmentOptimal);
- renderPass.AddAttachment (VkFormat.R16g16b16a16Sfloat, VkImageLayout.ColorAttachmentOptimal);
-
- renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
- renderPass.ClearValues.Add (new VkClearValue { depthStencil = new VkClearDepthStencilValue (1.0f, 0) });
- renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
- renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
- renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
- renderPass.ClearValues.Add (new VkClearValue { color = new VkClearColorValue (0.0f, 0.0f, 0.0f) });
-
- SubPass[] subpass = { new SubPass (), new SubPass () };
- subpass[0].AddColorReference ( new VkAttachmentReference (2, VkImageLayout.ColorAttachmentOptimal),
- new VkAttachmentReference (3, VkImageLayout.ColorAttachmentOptimal),
- new VkAttachmentReference (4, VkImageLayout.ColorAttachmentOptimal),
- new VkAttachmentReference (5, VkImageLayout.ColorAttachmentOptimal));
- subpass[0].SetDepthReference (1, VkImageLayout.DepthStencilAttachmentOptimal);
-
- subpass[1].AddColorReference (0, VkImageLayout.ColorAttachmentOptimal);
- subpass[1].AddInputReference ( new VkAttachmentReference (2, VkImageLayout.ShaderReadOnlyOptimal),
- new VkAttachmentReference (3, VkImageLayout.ShaderReadOnlyOptimal),
- new VkAttachmentReference (4, VkImageLayout.ShaderReadOnlyOptimal),
- new VkAttachmentReference (5, VkImageLayout.ShaderReadOnlyOptimal));
- renderPass.AddSubpass (subpass);
-
- renderPass.AddDependency (Vk.SubpassExternal, 0,
- VkPipelineStageFlags.BottomOfPipe, VkPipelineStageFlags.ColorAttachmentOutput,
- VkAccessFlags.MemoryRead, VkAccessFlags.ColorAttachmentRead | VkAccessFlags.ColorAttachmentWrite);
- renderPass.AddDependency (0, 1,
- VkPipelineStageFlags.ColorAttachmentOutput, VkPipelineStageFlags.FragmentShader,
- VkAccessFlags.ColorAttachmentWrite, VkAccessFlags.ShaderRead);
- renderPass.AddDependency (1, Vk.SubpassExternal,
- VkPipelineStageFlags.ColorAttachmentOutput, VkPipelineStageFlags.BottomOfPipe,
- VkAccessFlags.ColorAttachmentRead | VkAccessFlags.ColorAttachmentWrite, VkAccessFlags.MemoryRead);
-
-
- descriptorPool = new DescriptorPool (dev, 3,
- new VkDescriptorPoolSize (VkDescriptorType.UniformBuffer, 2),
- new VkDescriptorPoolSize (VkDescriptorType.CombinedImageSampler, 3),
- new VkDescriptorPoolSize (VkDescriptorType.InputAttachment, 4)
- );
-
- descLayoutMain = new DescriptorSetLayout (dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, VkDescriptorType.UniformBuffer),
- new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (2, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (3, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler));
-
- descLayoutModelTextures = new DescriptorSetLayout (dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (2, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (3, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (4, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler)
- );
-
- descLayoutGBuff = new DescriptorSetLayout (dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.InputAttachment),
- new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.InputAttachment),
- new VkDescriptorSetLayoutBinding (2, VkShaderStageFlags.Fragment, VkDescriptorType.InputAttachment),
- new VkDescriptorSetLayoutBinding (3, VkShaderStageFlags.Fragment, VkDescriptorType.InputAttachment));
-
- dsMain = descriptorPool.Allocate (descLayoutMain);
- dsGBuff = descriptorPool.Allocate (descLayoutGBuff);
-
- GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, samples);
- cfg.Layout = new PipelineLayout (dev, descLayoutMain, descLayoutModelTextures, descLayoutGBuff);
- cfg.Layout.AddPushConstants (
- new VkPushConstantRange (VkShaderStageFlags.Vertex, (uint)Marshal.SizeOf<Matrix4x4> ()),
- new VkPushConstantRange (VkShaderStageFlags.Fragment, sizeof(int), 64)
- );
- cfg.RenderPass = renderPass;
- cfg.blendAttachments.Add (new VkPipelineColorBlendAttachmentState (false));
- cfg.blendAttachments.Add (new VkPipelineColorBlendAttachmentState (false));
- cfg.blendAttachments.Add (new VkPipelineColorBlendAttachmentState (false));
-
- cfg.AddVertexBinding<Model.Vertex> (0);
- cfg.SetVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32b32Sfloat, VkFormat.R32g32Sfloat);
- cfg.AddShader (VkShaderStageFlags.Vertex, "shaders/pbrtest.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "shaders/GBuffPbr.frag.spv");
-
- gBuffPipeline = new GraphicPipeline (cfg);
- cfg.blendAttachments.Clear ();
- cfg.blendAttachments.Add (new VkPipelineColorBlendAttachmentState (false));
- cfg.ResetShadersAndVerticesInfos ();
- cfg.SubpassIndex = 1;
- cfg.Layout = gBuffPipeline.Layout;
- cfg.depthStencilState.depthTestEnable = false;
- cfg.depthStencilState.depthWriteEnable = false;
- cfg.AddShader (VkShaderStageFlags.Vertex, "shaders/FullScreenQuad.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "shaders/pbrtest.frag.spv");
- composePipeline = new GraphicPipeline (cfg);
-
- envCube = new EnvironmentCube (presentQueue, renderPass);
-
- uboMats = new HostBuffer (dev, VkBufferUsageFlags.UniformBuffer, (ulong)Marshal.SizeOf<Matrices> () * 2);
- uboMats.Map ();//permanent map
-
- DescriptorSetWrites uboUpdate = new DescriptorSetWrites (descLayoutMain);
- uboUpdate.Write (dev, dsMain, uboMats.Descriptor,
- envCube.lutBrdf.Descriptor,
- envCube.irradianceCube.Descriptor,
- envCube.prefilterCube.Descriptor);
- uboMats.Descriptor.offset = (ulong)Marshal.SizeOf<Matrices> ();
- envCube.WriteDesc (uboMats.Descriptor);
-#if DEBUG
- debugDraw = new DebugDrawPipeline (dev, descLayoutMain, swapChain.ColorFormat);
- debugDraw.AddLine (Vector3.Zero, new Vector3(matrices.lightPos.X,matrices.lightPos.Y,matrices.lightPos.Z)*3, 1, 1, 1);
- debugDraw.AddLine (Vector3.Zero, Vector3.UnitX, 1, 0, 0);
- debugDraw.AddLine (Vector3.Zero, Vector3.UnitY, 0, 1, 0);
- debugDraw.AddLine (Vector3.Zero, Vector3.UnitZ, 0, 0, 1);
-#endif
-
-
- model = new Model (presentQueue, "../data/models/DamagedHelmet/glTF/DamagedHelmet.gltf");
- //model = new Model (presentQueue, "../data/models/chess.gltf");
- //model = new Model (presentQueue, "../data/models/Sponza/glTF/Sponza.gltf");
- //model = new Model (dev, presentQueue, "../data/models/icosphere.gltf");
- //model = new Model (dev, presentQueue, cmdPool, "../data/models/cube.gltf");
- model.WriteMaterialsDescriptorSets (descLayoutModelTextures,
- VK.AttachmentType.Color,
- VK.AttachmentType.Normal,
- VK.AttachmentType.AmbientOcclusion,
- VK.AttachmentType.PhysicalProps,
- VK.AttachmentType.Emissive);
- }
-
- void buildCommandBuffers () {
- for (int i = 0; i < swapChain.ImageCount; ++i) {
- cmds[i]?.Free ();
- cmds[i] = cmdPool.AllocateCommandBuffer ();
- cmds[i].Start ();
-
-#if DEBUG
- statPool.Begin (cmds[i]);
- recordDraw (cmds[i], frameBuffers[i]);
- statPool.End (cmds[i]);
-
- debugDraw.RecordDraw (cmds[i], debugFB[i], camera);
-#else
- recordDraw (cmds[i], frameBuffers[i]);
-#endif
-
- cmds[i].End ();
- }
- }
- void recordDraw (CommandBuffer cmd, Framebuffer fb) {
- renderPass.Begin (cmd, fb);
-
- cmd.SetViewport (fb.Width, fb.Height);
- cmd.SetScissor (fb.Width, fb.Height);
-
- cmd.BindDescriptorSet (gBuffPipeline.Layout, dsMain);
- gBuffPipeline.Bind (cmd);
- model.Bind (cmd);
- model.DrawAll (cmd, gBuffPipeline.Layout);
-
- renderPass.BeginSubPass (cmd);
-
- cmd.BindDescriptorSet (composePipeline.Layout, dsGBuff, 2);
- composePipeline.Bind (cmd);
-
- cmd.Draw (3, 1, 0, 0);
-
- renderPass.End (cmd);
- }
-
-#region update
- void updateMatrices () {
- camera.AspectRatio = (float)swapChain.Width / swapChain.Height;
-
- matrices.projection = camera.Projection;
- matrices.view = camera.View;
- matrices.model = camera.Model;
- uboMats.Update (matrices, (uint)Marshal.SizeOf<Matrices> ());
- matrices.view *= Matrix4x4.CreateTranslation (-matrices.view.Translation);
- matrices.model = Matrix4x4.Identity;
- uboMats.Update (matrices, (uint)Marshal.SizeOf<Matrices> (), (uint)Marshal.SizeOf<Matrices> ());
- }
-
- public override void UpdateView () {
- updateMatrices ();
- updateViewRequested = false;
- }
- public override void Update () {
-#if DEBUG
- results = statPool.GetResults ();
-#endif
- }
-#endregion
-
-
-
- void createGBuff () {
- gbColorRough?.Dispose ();
- gbEmitMetal?.Dispose ();
- gbN?.Dispose ();
- gbPos?.Dispose ();
-
- gbColorRough = new Image (dev, VkFormat.R8g8b8a8Unorm, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment, VkMemoryPropertyFlags.DeviceLocal, swapChain.Width, swapChain.Height);
- gbEmitMetal = new Image (dev, VkFormat.R8g8b8a8Unorm, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment, VkMemoryPropertyFlags.DeviceLocal, swapChain.Width, swapChain.Height);
- gbN = new Image (dev, VkFormat.R16g16b16a16Sfloat, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment, VkMemoryPropertyFlags.DeviceLocal, swapChain.Width, swapChain.Height);
- gbPos = new Image (dev, VkFormat.R16g16b16a16Sfloat, VkImageUsageFlags.InputAttachment | VkImageUsageFlags.ColorAttachment, VkMemoryPropertyFlags.DeviceLocal, swapChain.Width, swapChain.Height);
-
- gbColorRough.CreateView ();
- gbColorRough.CreateSampler ();
- gbEmitMetal.CreateView ();
- gbEmitMetal.CreateSampler ();
- gbN.CreateView ();
- gbN.CreateSampler ();
- gbPos.CreateView ();
- gbPos.CreateSampler ();
-
- DescriptorSetWrites uboUpdate = new DescriptorSetWrites (descLayoutGBuff);
- uboUpdate.Write (dev, dsGBuff, gbColorRough.Descriptor,
- gbEmitMetal.Descriptor,
- gbN.Descriptor,
- gbPos.Descriptor);
- gbColorRough.SetName ("GBuffColorRough");
- gbEmitMetal.SetName ("GBuffEmitMetal");
- gbN.SetName ("GBuffN");
- gbPos.SetName ("GBuffPos");
- }
-
- protected override void OnResize () {
- updateMatrices ();
-
- if (frameBuffers != null)
- for (int i = 0; i < swapChain.ImageCount; ++i)
- frameBuffers[i]?.Dispose ();
-#if DEBUG
- if (debugFB != null)
- for (int i = 0; i < swapChain.ImageCount; ++i)
- debugFB[i]?.Dispose ();
-#endif
-
- createGBuff ();
-
- frameBuffers = new Framebuffer[swapChain.ImageCount];
- debugFB = new Framebuffer[swapChain.ImageCount];
-
- for (int i = 0; i < swapChain.ImageCount; ++i) {
- frameBuffers[i] = new Framebuffer (renderPass, swapChain.Width, swapChain.Height, new Image[] {
- swapChain.images[i], null, gbColorRough, gbEmitMetal, gbN, gbPos});
-#if DEBUG
- debugFB[i] = new Framebuffer (debugDraw.RenderPass, swapChain.Width, swapChain.Height,(debugDraw.Samples == VkSampleCountFlags.SampleCount1)
- ? new Image[] { swapChain.images[i] } : new Image[] { null, swapChain.images[i] });
- debugFB[i].SetName ("main FB " + i);
-#endif
- }
-
- buildCommandBuffers ();
- }
-
-
- #region Mouse and keyboard
- protected override void onKeyDown (Key key, int scanCode, Modifier modifiers) {
- switch (key) {
- case Key.F1:
- if (modifiers.HasFlag (Modifier.Shift))
- matrices.exposure -= 0.3f;
- else
- matrices.exposure += 0.3f;
- break;
- case Key.F2:
- if (modifiers.HasFlag (Modifier.Shift))
- matrices.gamma -= 0.1f;
- else
- matrices.gamma += 0.1f;
- break;
- case Key.F3:
- if (camera.Type == Camera.CamType.FirstPerson)
- camera.Type = Camera.CamType.LookAt;
- else
- camera.Type = Camera.CamType.FirstPerson;
- Console.WriteLine ($"camera type = {camera.Type}");
- break;
- default:
- base.onKeyDown (key, scanCode, modifiers);
- return;
- }
- updateViewRequested = true;
- }
-#endregion
-
- protected override void Dispose (bool disposing) {
- if (disposing) {
- if (!isDisposed) {
- dev.WaitIdle ();
- for (int i = 0; i < swapChain.ImageCount; ++i)
- frameBuffers[i]?.Dispose ();
-
- gbColorRough.Dispose ();
- gbEmitMetal.Dispose ();
- gbN.Dispose ();
- gbPos.Dispose ();
-
- gBuffPipeline.Dispose ();
- composePipeline.Dispose ();
-
- descLayoutMain.Dispose ();
- descLayoutModelTextures.Dispose ();
- descLayoutGBuff.Dispose ();
-
- uboMats.Dispose ();
- model.Dispose ();
- envCube.Dispose ();
-
- descriptorPool.Dispose ();
-#if DEBUG
- foreach (Framebuffer fb in debugFB)
- fb.Dispose ();
-
- debugDraw.Dispose ();
- timestampQPool?.Dispose ();
- statPool?.Dispose ();
-#endif
- }
- }
-
- base.Dispose (disposing);
- }
- }
-}
+++ /dev/null
-using System;
-using System.Numerics;
-using System.Runtime.InteropServices;
-using Glfw;
-using CVKL;
-using VK;
-using static CVKL.Camera;
-
-namespace modelWithVkvgStats {
- class Program : VkWindow {
-
- PipelineStatisticsQueryPool statPool;
- TimestampQueryPool timestampQPool;
-
- ulong[] results;
-
- protected override void configureEnabledFeatures (ref VkPhysicalDeviceFeatures features) {
- base.configureEnabledFeatures (ref features);
- features.pipelineStatisticsQuery = true;
- }
- public struct Matrices {
- public Matrix4x4 projection;
- public Matrix4x4 view;
- public Matrix4x4 model;
- public Vector4 lightPos;
- public float gamma;
- public float exposure;
- }
-
- public Matrices matrices = new Matrices {
- lightPos = new Vector4 (0.0f, 0.0f, -2.0f, 1.0f),
- gamma = 1.0f,
- exposure = 2.0f,
- };
-
- HostBuffer uboMats;
-
- DescriptorPool descriptorPool;
- DescriptorSetLayout descLayoutMatrix;
- DescriptorSetLayout descLayoutTextures;
- DescriptorSet dsMats;
-
- GraphicPipeline pipeline;
- GraphicPipeline uiPipeline;
- Framebuffer[] frameBuffers;
-
- Model model;
-
- vkvg.Device vkvgDev;
- vkvg.Surface vkvgSurf;
- Image vkvgImage;
-
- void vkvgDraw () {
-
- using (vkvg.Context ctx = new vkvg.Context (vkvgSurf)) {
- ctx.Operator = vkvg.Operator.Clear;
- ctx.Paint ();
- ctx.Operator = vkvg.Operator.Over;
-
- ctx.LineWidth = 1;
- ctx.SetSource (0.1, 0.1, 0.1, 0.3);
- ctx.Rectangle (5.5, 5.5, 400, 250);
- ctx.FillPreserve ();
- ctx.Flush ();
- ctx.SetSource (0.8, 0.8, 0.8);
- ctx.Stroke ();
-
- ctx.FontFace = "mono";
- ctx.FontSize = 10;
- int x = 16;
- int y = 40, dy = 16;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"fps: {fps,5} "));
- ctx.MoveTo (x + 200, y - 0.5);
- ctx.Rectangle (x + 200, y - 8.5, 0.1 * fps, 10);
- ctx.SetSource (0.1, 0.9, 0.1);
- ctx.Fill ();
- ctx.SetSource (0.8, 0.8, 0.8);
- y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"Exposure:{matrices.exposure,5} "));
- y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"Gamma: {matrices.gamma,5} "));
- if (results == null)
- return;
-
- y += dy*2;
- ctx.MoveTo (x, y);
- ctx.ShowText ("Pipeline Statistics");
- ctx.MoveTo (x-2, 2.5+y);
- ctx.LineTo (x+160, 2.5+y);
- ctx.Stroke ();
- y += 4;
- x += 20;
-
- for (int i = 0; i < statPool.RequestedStats.Length; i++) {
- y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"{statPool.RequestedStats[i].ToString(),-30} :{results[i],12:0,0} "));
- }
-
- y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"{"Elapsed microsecond",-20} :{timestampQPool.ElapsedMiliseconds:0.0000} "));
- }
- }
-
- Program () : base () {
- vkvgDev = new vkvg.Device (instance.Handle, phy.Handle, dev.VkDev.Handle, presentQueue.qFamIndex,
- vkvg.SampleCount.Sample_4, presentQueue.index);
-
- camera.Type = CamType.FirstPerson;
- camera.Model = Matrix4x4.CreateScale (0.05f) * Matrix4x4.CreateRotationX((float)Math.PI);
- //Camera.SetRotation (-0.1f,-0.4f);
- camera.SetPosition (0, 2, -3);
-
- init ();
-
- model = new Model (presentQueue, "../data/models/Sponza/glTF/Sponza.gltf");
- model.WriteMaterialsDescriptorSets (descLayoutTextures,
- VK.AttachmentType.Color,
- VK.AttachmentType.Normal,
- VK.AttachmentType.AmbientOcclusion,
- VK.AttachmentType.PhysicalProps,
- VK.AttachmentType.Emissive);
- }
-
- void init (VkSampleCountFlags samples = VkSampleCountFlags.SampleCount4) {
- descriptorPool = new DescriptorPool (dev, 2,
- new VkDescriptorPoolSize (VkDescriptorType.UniformBuffer),
- new VkDescriptorPoolSize (VkDescriptorType.CombinedImageSampler)
- );
-
- descLayoutMatrix = new DescriptorSetLayout (dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Vertex|VkShaderStageFlags.Fragment, VkDescriptorType.UniformBuffer),
- new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler)
- );
-
- descLayoutTextures = new DescriptorSetLayout (dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (2, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (3, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (4, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler)
- );
-
- dsMats = descriptorPool.Allocate (descLayoutMatrix);
-
- GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, samples);
-
- cfg.Layout = new PipelineLayout (dev, descLayoutMatrix, descLayoutTextures);
- cfg.Layout.AddPushConstants (
- new VkPushConstantRange (VkShaderStageFlags.Vertex, (uint)Marshal.SizeOf<Matrix4x4> ()),
- new VkPushConstantRange (VkShaderStageFlags.Fragment, (uint)Marshal.SizeOf<Model.PbrMaterial> (), 64)
- );
- cfg.RenderPass = new RenderPass (dev, swapChain.ColorFormat, dev.GetSuitableDepthFormat (), samples);
-
- cfg.AddVertexBinding<Model.Vertex> (0);
- cfg.SetVertexAttributes (0, VkFormat.R32g32b32Sfloat, VkFormat.R32g32b32Sfloat, VkFormat.R32g32Sfloat);
-
- cfg.AddShader (VkShaderStageFlags.Vertex, "shaders/pbrtest.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "shaders/pbrtest.frag.spv");
-
- pipeline = new GraphicPipeline (cfg);
-
- cfg.ResetShadersAndVerticesInfos ();
- cfg.AddShader (VkShaderStageFlags.Vertex, "shaders/FullScreenQuad.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "shaders/simpletexture.frag.spv");
-
- cfg.blendAttachments[0] = new VkPipelineColorBlendAttachmentState (true);
-
- uiPipeline = new GraphicPipeline (cfg);
-
- uboMats = new HostBuffer (dev, VkBufferUsageFlags.UniformBuffer, (ulong)Marshal.SizeOf<Matrices>());
- uboMats.Map ();//permanent map
-
- DescriptorSetWrites uboUpdate = new DescriptorSetWrites (dsMats, descLayoutMatrix.Bindings[0]);
- uboUpdate.Write (dev, uboMats.Descriptor);
-
- cfg.Layout.SetName ("Main Pipeline layout");
- uboMats.SetName ("uboMats");
- descriptorPool.SetName ("main pool");
- descLayoutTextures.SetName ("descLayoutTextures");
-
- statPool = new PipelineStatisticsQueryPool (dev,
- VkQueryPipelineStatisticFlags.InputAssemblyVertices |
- VkQueryPipelineStatisticFlags.InputAssemblyPrimitives |
- VkQueryPipelineStatisticFlags.ClippingInvocations |
- VkQueryPipelineStatisticFlags.ClippingPrimitives |
- VkQueryPipelineStatisticFlags.FragmentShaderInvocations);
-
- timestampQPool = new TimestampQueryPool (dev);
-
- }
-
- void buildCommandBuffers () {
- for (int i = 0; i < swapChain.ImageCount; ++i) {
- cmds[i]?.Free ();
-
- cmds[i] = cmdPool.AllocateCommandBuffer ();
- cmds[i].Start ();
-
- statPool.Begin (cmds[i]);
- cmds[i].BeginRegion ("draw" + i, 0.5f, 1f, 0f);
- cmds[i].Handle.SetDebugMarkerName (dev, "cmd Draw" + i);
- recordDraw (cmds[i], frameBuffers[i]);
- cmds[i].EndRegion ();
- statPool.End (cmds[i]);
- cmds[i].End ();
- }
- }
- void recordDraw (CommandBuffer cmd, Framebuffer fb) {
- cmd.BeginRegion ("models", 0.5f, 1f, 0f);
- pipeline.RenderPass.Begin (cmd, fb);
-
- cmd.SetViewport (fb.Width, fb.Height);
- cmd.SetScissor (fb.Width, fb.Height);
-
- cmd.BindDescriptorSet (pipeline.Layout, dsMats);
- pipeline.Bind (cmd);
- model.Bind (cmd);
- model.DrawAll (cmd, pipeline.Layout);
-
- cmd.EndRegion ();
- cmd.BeginRegion ("vkvg", 0.5f, 1f, 0f);
- uiPipeline.Bind (cmd);
-
- timestampQPool.Start (cmd);
-
- vkvgImage.SetLayout (cmd, VkImageAspectFlags.Color, VkImageLayout.ColorAttachmentOptimal, VkImageLayout.ShaderReadOnlyOptimal,
- VkPipelineStageFlags.ColorAttachmentOutput, VkPipelineStageFlags.FragmentShader);
-
- cmd.Draw (3, 1, 0, 0);
-
- vkvgImage.SetLayout (cmd, VkImageAspectFlags.Color, VkImageLayout.ShaderReadOnlyOptimal, VkImageLayout.ColorAttachmentOptimal,
- VkPipelineStageFlags.FragmentShader, VkPipelineStageFlags.BottomOfPipe);
-
- timestampQPool.End (cmd);
-
- pipeline.RenderPass.End (cmd);
- cmd.EndRegion ();
- }
-
- #region update
- void updateMatrices () {
-
- camera.AspectRatio = (float)swapChain.Width / swapChain.Height;
-
- matrices.projection = camera.Projection;
- matrices.view = camera.View;
- matrices.model = camera.Model;
- uboMats.Update (matrices, (uint)Marshal.SizeOf<Matrices> ());
- }
-
- public override void UpdateView () {
- updateMatrices ();
- updateViewRequested = false;
- }
- public override void Update () {
- results = statPool.GetResults ();
- vkvgDraw ();
- }
- #endregion
-
- #region mouse and keyboard
- protected override void onKeyDown (Key key, int scanCode, Modifier modifiers) {
- switch (key) {
- case Key.F1:
- if (modifiers.HasFlag (Modifier.Shift))
- matrices.exposure -= 0.3f;
- else
- matrices.exposure += 0.3f;
- break;
- case Key.F2:
- if (modifiers.HasFlag (Modifier.Shift))
- matrices.gamma -= 0.1f;
- else
- matrices.gamma += 0.1f;
- break;
- case Key.F3:
- if (camera.Type == CamType.FirstPerson)
- camera.Type = CamType.LookAt;
- else
- camera.Type = CamType.FirstPerson;
- break;
- default:
- base.onKeyDown (key, scanCode, modifiers);
- return;
- }
- updateViewRequested = true;
- }
- #endregion
-
- protected override void OnResize () {
-
- vkvgImage?.Dispose ();
- vkvgSurf?.Dispose ();
- vkvgSurf = new vkvg.Surface (vkvgDev, (int)swapChain.Width, (int)swapChain.Height);
- vkvgImage = new Image (dev, new VkImage ((ulong)vkvgSurf.VkImage.ToInt64 ()), VkFormat.B8g8r8a8Unorm,
- VkImageUsageFlags.ColorAttachment, (uint)vkvgSurf.Width, (uint)vkvgSurf.Height);
- vkvgImage.CreateView (VkImageViewType.ImageView2D, VkImageAspectFlags.Color);
- vkvgImage.CreateSampler (VkFilter.Nearest,VkFilter.Nearest, VkSamplerMipmapMode.Nearest, VkSamplerAddressMode.ClampToBorder);
-
- vkvgImage.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
- DescriptorSetWrites uboUpdate = new DescriptorSetWrites (dsMats, descLayoutMatrix.Bindings[1]);
- uboUpdate.Write (dev, vkvgImage.Descriptor);
-
- updateMatrices ();
-
- if (frameBuffers!=null)
- for (int i = 0; i < swapChain.ImageCount; ++i)
- frameBuffers[i]?.Dispose ();
-
- frameBuffers = new Framebuffer[swapChain.ImageCount];
-
- for (int i = 0; i < swapChain.ImageCount; ++i) {
- frameBuffers[i] = new Framebuffer (pipeline.RenderPass, swapChain.Width, swapChain.Height,
- (pipeline.Samples == VkSampleCountFlags.SampleCount1) ? new Image[] {
- swapChain.images[i],
- null
- } : new Image[] {
- null,
- null,
- swapChain.images[i]
- });
- frameBuffers[i].SetName ("main FB " + i);
-
- }
-
- buildCommandBuffers ();
- }
-
- protected override void Dispose (bool disposing) {
- if (disposing) {
- if (!isDisposed) {
- dev.WaitIdle ();
- for (int i = 0; i < swapChain.ImageCount; ++i)
- frameBuffers[i]?.Dispose ();
- model.Dispose ();
- pipeline.Dispose ();
- descLayoutMatrix.Dispose ();
- descLayoutTextures.Dispose ();
- descriptorPool.Dispose ();
-
- uboMats.Dispose ();
-
- vkvgSurf?.Dispose ();
- vkvgDev.Dispose ();
-
- timestampQPool.Dispose ();
- statPool.Dispose ();
- }
- }
-
- base.Dispose (disposing);
- }
- }
-}
descriptorPool = new DescriptorPool (Dev, 2,
new VkDescriptorPoolSize (VkDescriptorType.UniformBuffer, 2),
- new VkDescriptorPoolSize (VkDescriptorType.CombinedImageSampler, 9)
+ new VkDescriptorPoolSize (VkDescriptorType.CombinedImageSampler, 8)
);
descLayoutMain = new DescriptorSetLayout (Dev,
new VkDescriptorSetLayoutBinding (1, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
new VkDescriptorSetLayoutBinding (2, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
new VkDescriptorSetLayoutBinding (3, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
- new VkDescriptorSetLayoutBinding (4, VkShaderStageFlags.Fragment, VkDescriptorType.UniformBuffer),
- new VkDescriptorSetLayoutBinding (5, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler));//ui image
+ new VkDescriptorSetLayoutBinding (4, VkShaderStageFlags.Fragment, VkDescriptorType.UniformBuffer));
descLayoutTextures = new DescriptorSetLayout (Dev,
new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler),
init (cfg);
+ cfg.DisposeShaders ();
+
dsMain = descriptorPool.Allocate (descLayoutMain);
envCube = new Environment.EnvironmentCube (cubemapPathes[0], layout, staggingQ, RenderPass);
vke.Run ();
}
}
- protected override void configureEnabledFeatures (VkPhysicalDeviceFeatures available_features, ref VkPhysicalDeviceFeatures enabled_features) {
- base.configureEnabledFeatures (available_features, ref enabled_features);
-#if PIPELINE_STATS
- features.pipelineStatisticsQuery = true;
-#endif
- enabled_features.samplerAnisotropy = available_features.samplerAnisotropy;
- }
-
- VkSampleCountFlags samples = VkSampleCountFlags.SampleCount8;
+ VkSampleCountFlags samples = VkSampleCountFlags.SampleCount1;
FrameBuffers frameBuffers;
PBRPipeline pbrPipeline;
DebugView currentDebugView = DebugView.none;
-#if PIPELINE_STATS
- PipelineStatisticsQueryPool statPool;
- TimestampQueryPool timestampQPool;
- ulong[] results;
-#endif
bool queryUpdatePrefilCube, showDebugImg;
-#if WITH_VKVG
- //DescriptorSet dsDebugImg;
- //void initDebugImg () {
- // dsDebugImg = descriptorPool.Allocate (descLayoutMain);
- // pbrPipeline.envCube.debugImg.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
- // DescriptorSetWrites uboUpdate = new DescriptorSetWrites (dsDebugImg, descLayoutMain);
- // uboUpdate.Write (dev, pbrPipeline.envCube.debugImg.Descriptor);
- //}
-
- VkvgPipeline.VkvgPipeline vkvgPipeline;
-
- void vkvgDraw () {
- using (vkvg.Context ctx = vkvgPipeline.CreateContext ()) {
- ctx.Clear ();
-
- ctx.LineWidth = 1;
- ctx.SetSource (0.1, 0.1, 0.1, 0.8);
- ctx.Rectangle (5.5, 5.5, 320, 300);
- ctx.FillPreserve ();
- ctx.Flush ();
- ctx.SetSource (0.8, 0.8, 0.8);
- ctx.Stroke ();
-
- ctx.FontFace = "mono";
- ctx.FontSize = 8;
- int x = 16;
- int y = 40, dy = 16;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"fps: {fps,5} "));
- ctx.MoveTo (x + 200, y - 0.5);
- ctx.Rectangle (x + 200, y - 8.5, 0.1 * fps, 10);
- ctx.SetSource (0.1, 0.9, 0.1);
- ctx.Fill ();
- ctx.SetSource (0.8, 0.8, 0.8);
- y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"Exposure:{pbrPipeline.matrices.exposure,5} "));
- y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"Gamma: {pbrPipeline.matrices.gamma,5} "));
- y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"Light pos: {lightPos.ToString ()} "));
-
-#if PIPELINE_STATS
- if (results == null)
- return;
-
- y += dy*2;
- ctx.MoveTo (x, y);
- ctx.ShowText ("Pipeline Statistics");
- ctx.MoveTo (x-2, 4.5+y);
- ctx.LineTo (x+160, 4.5+y);
- ctx.Stroke ();
- y += 4;
- x += 20;
-
- for (int i = 0; i < statPool.RequestedStats.Length; i++) {
- y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"{statPool.RequestedStats[i].ToString(),-30} :{results[i],12:0,0} "));
- }
- /*y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"{"Elapsed microsecond",-20} :{timestampQPool.ElapsedMiliseconds:0.0000} "));*/
-#endif
- y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"{"Debug draw (numpad 0->6)",-30} : {currentDebugView.ToString ()} "));
- /*y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"{"Debug Prefil Face: (f)",-30} : {pbrPipeline.envCube.debugFace.ToString ()} "));
- y += dy;
- ctx.MoveTo (x, y);
- ctx.ShowText (string.Format ($"{"Debug Prefil Mip: (m)",-30} : {pbrPipeline.envCube.debugMip.ToString ()} "));
- */
- vkvgPipeline.DrawResources (ctx, (int)Width, (int)Height);
- }
- }
-#endif
-
-
Vector4 lightPos = new Vector4 (1, 0, 0, 0);
uint curModelIndex = 0;
new RenderPass (dev, swapChain.ColorFormat, dev.GetSuitableDepthFormat (), samples));
loadCurrentModel ();
-
-#if PIPELINE_STATS
- statPool = new PipelineStatisticsQueryPool (dev,
- VkQueryPipelineStatisticFlags.InputAssemblyVertices |
- VkQueryPipelineStatisticFlags.InputAssemblyPrimitives |
- VkQueryPipelineStatisticFlags.ClippingInvocations |
- VkQueryPipelineStatisticFlags.ClippingPrimitives |
- VkQueryPipelineStatisticFlags.FragmentShaderInvocations);
-
- timestampQPool = new TimestampQueryPool (dev);
-#endif
-
-#if WITH_VKVG
- vkvgPipeline = new VkvgPipeline.VkvgPipeline (instance, dev, presentQueue, pbrPipeline);
-#endif
}
bool rebuildBuffers, reloadModel;
for (int i = 0; i < swapChain.ImageCount; ++i) {
cmds[i]?.Free ();
cmds[i] = cmdPool.AllocateAndStart ();
-#if PIPELINE_STATS
- statPool.Begin (cmds[i]);
- recordDraw (cmds[i], frameBuffers[i]);
- statPool.End (cmds[i]);
-#else
recordDraw (cmds[i], frameBuffers[i]);
-#endif
-
cmds[i].End ();
}
}
cmd.SetScissor (fb.Width, fb.Height);
pbrPipeline.RecordDraw (cmd);
-
-#if WITH_VKVG
- vkvgPipeline.RecordDraw (cmd);
-#endif
pbrPipeline.RenderPass.End (cmd);
}
reloadModel = false;
rebuildBuffers = true;
}
-#if PIPELINE_STATS
- results = statPool.GetResults ();
-#endif
if (rebuildBuffers) {
buildCommandBuffers ();
rebuildBuffers = false;
}
-#if WITH_VKVG
- vkvgDraw ();
-#endif
}
#endregion
base.OnResize ();
dev.WaitIdle ();
-#if WITH_VKVG
- vkvgPipeline.Resize ((int)swapChain.Width, (int)swapChain.Height,
- new DescriptorSetWrites (pbrPipeline.dsMain, pbrPipeline.Layout.DescriptorSetLayouts[0].Bindings[5]));
-#endif
-
UpdateView ();
frameBuffers?.Dispose ();
else
curModelIndex = curModelIndex < (uint)modelPathes.Length - 1 ? curModelIndex + 1 : 0;
reloadModel = true;
- break;
- /*
- case Key.F:
- if (modifiers.HasFlag (Modifier.Shift)) {
- pbrPipeline.envCube.debugFace --;
- if (pbrPipeline.envCube.debugFace < 0)
- pbrPipeline.envCube.debugFace = 5;
- } else {
- pbrPipeline.envCube.debugFace ++;
- if (pbrPipeline.envCube.debugFace > 5)
- pbrPipeline.envCube.debugFace = 0;
- }
- queryUpdatePrefilCube = updateViewRequested = true;
- break;
- case Key.M:
- if (modifiers.HasFlag (Modifier.Shift)) {
- pbrPipeline.envCube.debugMip --;
- if (pbrPipeline.envCube.debugMip < 0)
- pbrPipeline.envCube.debugMip = (int)pbrPipeline.envCube.prefilterCube.CreateInfo.mipLevels - 1;
- } else {
- pbrPipeline.envCube.debugMip ++;
- if (pbrPipeline.envCube.debugMip > pbrPipeline.envCube.prefilterCube.CreateInfo.mipLevels)
- pbrPipeline.envCube.debugMip = 0;
- }
- queryUpdatePrefilCube = updateViewRequested = true;
- break;*/
+ break;
case Key.P:
showDebugImg = !showDebugImg;
queryUpdatePrefilCube = updateViewRequested = true;
dev.WaitIdle ();
frameBuffers?.Dispose ();
pbrPipeline.Dispose ();
-#if WITH_VKVG
- vkvgPipeline.Dispose ();
-#endif
-
-#if PIPELINE_STATS
- timestampQPool?.Dispose ();
- statPool?.Dispose ();
-#endif
}
}
<ItemGroup>
<ProjectReference Include="..\..\addons\gltfLoader\gltfLoader.csproj" />
- <ProjectReference Include="..\..\addons\VkvgPipeline\VkvgPipeline.csproj" />
- <ProjectReference Include="..\..\addons\EnvironmentPipeline\EnvironmentPipeline.csproj" />
+ <ProjectReference Include="..\..\addons\EnvironmentPipeline\EnvironmentPipeline.csproj" />
</ItemGroup>
</Project>
+++ /dev/null
-<?xml version="1.0"?>
-<VerticalStack Left="10" Top="100" Width="30%" Height="Fit" Spacing="2" Background="0.3,0.3,0.3,0.9" Margin="20">
- <HorizontalStack Height="Fit">
- <Label Text="Fps:" Width="80" Background="SteelBlue"/>
- <Label Text="{fps}" />
- </HorizontalStack>
- <HorizontalStack Height="Fit">
- <Label Text="Gamma:" Width="80" Background="SteelBlue"/>
- <Slider Height="20" Value="{²Gamma}" Maximum="10.0" SmallIncrement="0.1" LargeIncrement="1.0"/>
- <Label Text="{Gamma}" Width="40" TextAlignment="Right"/>
- </HorizontalStack>
- <HorizontalStack Height="Fit">
- <Label Text="Exposure:" Width="80" Background="SteelBlue"/>
- <Slider Height="20" Value="{²Exposure}" Maximum="10.0" SmallIncrement="0.1" LargeIncrement="1.0"/>
- <Label Text="{Exposure}" Width="40" TextAlignment="Right"/>
- </HorizontalStack>
-<!-- <ComboBox Data="{cubemapPathes}"/>-->
-</VerticalStack>
-<!--<Window Caption="Showcase" Height="30%" Width="20%" Top="10" Left="10">-->
-<!--</Window>-->
-<!--<Label Text="{fps}" Background="SteelBlue" Margin="0" Font="mono,20"/>-->
-
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "pbr", "samples\pbr\pbr.csproj", "{7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "glow", "samples\glow\glow.csproj", "{82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "crowWin", "samples\crowWin\crowWin.csproj", "{A05AAF6C-E925-4EF1-B051-A6DDA5BCB536}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CrowWindow", "addons\CrowWindow\CrowWindow.csproj", "{5AE929DA-4EA2-4BD9-BA38-7258AA9D2E4D}"
EndProject
Global
{7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}.Release|Any CPU.Build.0 = Release|Any CPU
{7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}.ReleaseSpirVTasks|Any CPU.ActiveCfg = Release|Any CPU
{7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5}.ReleaseSpirVTasks|Any CPU.Build.0 = Release|Any CPU
- {82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
- {82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE}.BuildPackages|Any CPU.Build.0 = Release|Any CPU
- {82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
- {82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
- {82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE}.Release|Any CPU.Build.0 = Release|Any CPU
- {82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE}.ReleaseSpirVTasks|Any CPU.ActiveCfg = Debug|Any CPU
- {82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE}.ReleaseSpirVTasks|Any CPU.Build.0 = Debug|Any CPU
- {A05AAF6C-E925-4EF1-B051-A6DDA5BCB536}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
- {A05AAF6C-E925-4EF1-B051-A6DDA5BCB536}.BuildPackages|Any CPU.Build.0 = Release|Any CPU
- {A05AAF6C-E925-4EF1-B051-A6DDA5BCB536}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A05AAF6C-E925-4EF1-B051-A6DDA5BCB536}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A05AAF6C-E925-4EF1-B051-A6DDA5BCB536}.DebugCrow|Any CPU.ActiveCfg = Debug|Any CPU
- {A05AAF6C-E925-4EF1-B051-A6DDA5BCB536}.DebugCrow|Any CPU.Build.0 = Debug|Any CPU
- {A05AAF6C-E925-4EF1-B051-A6DDA5BCB536}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A05AAF6C-E925-4EF1-B051-A6DDA5BCB536}.Release|Any CPU.Build.0 = Release|Any CPU
- {A05AAF6C-E925-4EF1-B051-A6DDA5BCB536}.ReleaseSpirVTasks|Any CPU.ActiveCfg = Debug|Any CPU
- {A05AAF6C-E925-4EF1-B051-A6DDA5BCB536}.ReleaseSpirVTasks|Any CPU.Build.0 = Debug|Any CPU
{5AE929DA-4EA2-4BD9-BA38-7258AA9D2E4D}.BuildPackages|Any CPU.ActiveCfg = Release|Any CPU
{5AE929DA-4EA2-4BD9-BA38-7258AA9D2E4D}.BuildPackages|Any CPU.Build.0 = Release|Any CPU
{5AE929DA-4EA2-4BD9-BA38-7258AA9D2E4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8185163E-A67C-4C0E-8548-67E2A9F16309} = {16439374-B8DB-4643-8116-EB3358B49A12}
{D9A41382-444E-44ED-B638-3D8F06F2FBC2} = {16439374-B8DB-4643-8116-EB3358B49A12}
{7EB2430B-6BC0-4AE9-B1FA-57C3DB2AE1C5} = {16439374-B8DB-4643-8116-EB3358B49A12}
- {82947B19-1EFA-4DF9-8BB8-56B0B48F3FBE} = {16439374-B8DB-4643-8116-EB3358B49A12}
- {A05AAF6C-E925-4EF1-B051-A6DDA5BCB536} = {16439374-B8DB-4643-8116-EB3358B49A12}
{5AE929DA-4EA2-4BD9-BA38-7258AA9D2E4D} = {4AA67AB0-C331-4CB2-9C00-B74F5DE31658}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
info.basePipelineIndex = 0;
Utils.CheckResult (Vk.vkCreateComputePipelines (Dev.VkDev, Cache == null ? VkPipelineCache.Null : Cache.handle, 1, ref info, IntPtr.Zero, out handle));
-
- Dev.DestroyShaderModule (info.stage.module);
}
}
base.Activate ();
throw new InvalidOperationException ("Could not find a suitable memory type!");
}
public VkFormat GetSuitableDepthFormat () {
- VkFormat[] formats = new VkFormat[] { VkFormat.D32SfloatS8Uint, VkFormat.D32Sfloat, VkFormat.D24UnormS8Uint, VkFormat.D16UnormS8Uint, VkFormat.D16Unorm };
+ VkFormat[] formats = new VkFormat[] {VkFormat.D32SfloatS8Uint, VkFormat.D32Sfloat, VkFormat.D24UnormS8Uint, VkFormat.D16UnormS8Uint, VkFormat.D16Unorm };
foreach (VkFormat f in formats) {
+ Console.WriteLine ( (int)phy.GetFormatProperties (f).optimalTilingFeatures);
if (phy.GetFormatProperties (f).optimalTilingFeatures.HasFlag(VkFormatFeatureFlags.DepthStencilAttachment))
return f;
}