]> O.S.I.I.S - jp/vke.net.git/commitdiff
use environmentPipeline from addons, clear duplicate shaders, fixed viewport state...
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Mon, 7 Oct 2019 22:22:13 +0000 (00:22 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Mon, 7 Oct 2019 22:22:13 +0000 (00:22 +0200)
27 files changed:
addons/DistanceFieldFont/DistanceFieldFont.csproj
addons/EnvironmentPipeline/EnvironmentPipeline.cs
addons/EnvironmentPipeline/EnvironmentPipeline.csproj
samples/TexturedCube/shaders/FullScreenQuad.vert [deleted file]
samples/TexturedCube/shaders/simpletexture.frag [deleted file]
samples/Triangle/main.cs
samples/compute/delaunay.cs
samples/compute/shaders/FullScreenQuad.vert [deleted file]
samples/deferred/DeferredPbrRenderer.cs
samples/deferred/EnvironmentPipeline.cs
samples/deferred/deferred.csproj
samples/deferred/main.cs
samples/deferred/shaders/FullScreenQuad.vert [deleted file]
samples/deferred/shaders/filtercube.vert [deleted file]
samples/deferred/shaders/genbrdflut.frag [deleted file]
samples/deferred/shaders/genbrdflut.vert [deleted file]
samples/deferred/shaders/irradiancecube.frag [deleted file]
samples/deferred/shaders/prefilterenvmap.frag [deleted file]
samples/deferred/shaders/skybox.frag [deleted file]
samples/deferred/shaders/skybox.vert [deleted file]
samples/pbr/PbrPipeline.cs
samples/pbr/main.cs
samples/pbr/pbr.csproj
samples/pbr/shaders/FullScreenQuad.vert [deleted file]
vke/shaders/FullScreenQuad.vert
vke/src/base/GraphicPipeline.cs
vke/src/base/GraphicPipelineConfig.cs

index d94083979d1d5a1a02a451a09db7205c46d346ab..676196f07654b165f76f7a85de7427a9dc8554bc 100644 (file)
@@ -5,7 +5,7 @@
     <PackageId>vke.DistanceFieldFont</PackageId>
     <AssemblyVersion>0.1.0</AssemblyVersion>
     <Description>vke.net signed distance field font addons, BMFont file format</Description>
-    <PackageTags>C# vulkan CVKL gltf</PackageTags>    
+    <PackageTags>vulkan C# vke.net gltf</PackageTags>    
     <PackageVersion>$(AssemblyVersion)-beta</PackageVersion>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
     <PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
index 12a0df9e707c5398d50b63e5583e61cf6f297658..1ef9472d56ea40cd1ad324198216828ffb1b787a 100644 (file)
@@ -1,10 +1,9 @@
 using System;
-using System.Collections.Generic;
 using System.Numerics;
 using System.Runtime.InteropServices;
-using VK;
+using Vulkan;
 
-namespace CVKL {
+namespace vke.Environment {
        public class EnvironmentCube : GraphicPipeline {
 
                GPUBuffer vboSkybox;
@@ -33,8 +32,8 @@ namespace CVKL {
                                cfg.Layout = plLayout;
                                cfg.AddVertexBinding (0, 3 * sizeof (float));
                                cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat);
-                               cfg.AddShader (VkShaderStageFlags.Vertex, "#CVKLEnvironment.skybox.vert.spv");
-                               cfg.AddShader (VkShaderStageFlags.Fragment, "#CVKLEnvironment.skybox.frag.spv");
+                               cfg.AddShader (VkShaderStageFlags.Vertex, "#EnvironmentPipeline.skybox.vert.spv");
+                               cfg.AddShader (VkShaderStageFlags.Fragment, "#EnvironmentPipeline.skybox.frag.spv");
                                cfg.multisampleState.rasterizationSamples = Samples;
 
                                layout = cfg.Layout;
@@ -112,23 +111,21 @@ namespace CVKL {
                        lutBrdf.CreateView ();
                        lutBrdf.CreateSampler (VkSamplerAddressMode.ClampToEdge);
 
-                       GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, VkSampleCountFlags.SampleCount1, false);
+                       GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, VkSampleCountFlags.SampleCount1, false, dim, dim);
 
                        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, "#CVKLEnvironment.genbrdflut.vert.spv");
-                       cfg.AddShader (VkShaderStageFlags.Fragment, "#CVKLEnvironment.genbrdflut.frag.spv");
+                       cfg.AddShader (VkShaderStageFlags.Vertex, "#EnvironmentPipeline.genbrdflut.vert.spv");
+                       cfg.AddShader (VkShaderStageFlags.Fragment, "#EnvironmentPipeline.genbrdflut.frag.spv");
 
                        using (GraphicPipeline pl = new GraphicPipeline (cfg)) {
-                               using (Framebuffer fb = new Framebuffer (cfg.RenderPass, dim, dim, lutBrdf)) {
+                               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);
@@ -180,7 +177,7 @@ namespace CVKL {
                                new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler));
 
 
-                       GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, VkSampleCountFlags.SampleCount1, false);
+                       GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, VkSampleCountFlags.SampleCount1, false, (int)dim, (int)dim);
                        cfg.Layout = new PipelineLayout (Dev, dsLayout);
                        cfg.Layout.AddPushConstants (
                                new VkPushConstantRange (VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, (uint)Marshal.SizeOf<Matrix4x4> () + 8));
@@ -193,11 +190,11 @@ namespace CVKL {
                        cfg.AddVertexBinding (0, 3 * sizeof (float));
                        cfg.AddVertexAttributes (0, VkFormat.R32g32b32Sfloat);
 
-                       cfg.AddShader (VkShaderStageFlags.Vertex, "#CVKLEnvironment.filtercube.vert.spv");
+                       cfg.AddShader (VkShaderStageFlags.Vertex, "#EnvironmentPipeline.filtercube.vert.spv");
                        if (target == CBTarget.PREFILTEREDENV)
-                               cfg.AddShader (VkShaderStageFlags.Fragment, "#CVKLEnvironment.prefilterenvmap.frag.spv");
+                               cfg.AddShader (VkShaderStageFlags.Fragment, "#EnvironmentPipeline.prefilterenvmap.frag.spv");
                        else
-                               cfg.AddShader (VkShaderStageFlags.Fragment, "#CVKLEnvironment.irradiancecube.frag.spv");
+                               cfg.AddShader (VkShaderStageFlags.Fragment, "#EnvironmentPipeline.irradiancecube.frag.spv");
 
                        Matrix4x4[] matrices = {
                                // POSITIVE_X
@@ -223,7 +220,7 @@ namespace CVKL {
                                dsUpdate.Write (Dev, dset, cubemap.Descriptor);
                                Dev.WaitIdle ();
 
-                               using (Framebuffer fb = new Framebuffer (pl.RenderPass, dim, dim, imgFbOffscreen)) {
+                               using (FrameBuffer fb = new FrameBuffer (pl.RenderPass, dim, dim, imgFbOffscreen)) {
                                        CommandBuffer cmd = cmdPool.AllocateCommandBuffer ();
                                        cmd.Start (VkCommandBufferUsageFlags.OneTimeSubmit);
 
@@ -231,9 +228,6 @@ namespace CVKL {
 
                                        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);
 
index 511e55b99eabbb6cbe4987fc8efc1da4c39cee27..ef6f39c384ce8651782580657157101de97f4466 100644 (file)
@@ -1,20 +1,18 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
-  <Import Project="$(RootDirectory)netfx.props" />
   <PropertyGroup>
-    <AssemblyName>CVKLEnvironment</AssemblyName>
-    <PackageId>CVKLEnvironmentPipeline</PackageId>
+    <AssemblyName>EnvironmentPipeline</AssemblyName>
+    <PackageId>vke.EnvironmentPipeline</PackageId>
     <AssemblyVersion>0.1.0</AssemblyVersion>
-    <Description>CVKL Environment cube</Description>
-    <PackageTags>vulkan CVKL</PackageTags>    
+    <Description>vke.net Environment cube pipeline</Description>
+    <PackageTags>vulkan c# vke.net</PackageTags>    
     <PackageVersion>$(AssemblyVersion)-beta</PackageVersion>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
     <PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
-    <PackageProjectUrl>https://github.com/jpbruyere/vk.net/blob/master/README.md</PackageProjectUrl>
+    <PackageProjectUrl>https://github.com/jpbruyere/vke.net/blob/master/README.md</PackageProjectUrl>
     <License>MIT</License>
     <PackageReleaseNotes></PackageReleaseNotes>
     <SynchReleaseVersion>false</SynchReleaseVersion>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>    
   </PropertyGroup>
-
 </Project>
diff --git a/samples/TexturedCube/shaders/FullScreenQuad.vert b/samples/TexturedCube/shaders/FullScreenQuad.vert
deleted file mode 100644 (file)
index 826720b..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#version 450
-
-layout (location = 0) out vec2 outUV;
-
-void main()
-{
-       outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
-       gl_Position = vec4(outUV * 2.0f + -1.0f, 0.0f, 1.0f);
-       //gl_Position = vec4(outUV -1.0f, 0.0f, 1.0f);
-}
diff --git a/samples/TexturedCube/shaders/simpletexture.frag b/samples/TexturedCube/shaders/simpletexture.frag
deleted file mode 100644 (file)
index cee63cb..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#version 450
-
-#extension GL_ARB_separate_shader_objects : enable
-#extension GL_ARB_shading_language_420pack : enable
-
-layout (set = 0, binding = 1) uniform sampler2D samplerColor;
-
-layout (location = 0) in       vec2 inUV;
-
-layout (location = 0) out      vec4 outFragColor;
-
-void main()
-{
-       outFragColor = texture(samplerColor, inUV);
-}
index a9d5091fbde8584a5d6bb54953996f96dc289d28..3524a2d42e287e16773704f39931f72871bdbb62 100644 (file)
@@ -107,12 +107,13 @@ namespace Triangle {
                protected override void onMouseMove (double xPos, double yPos) {
                        double diffX = lastMouseX - xPos;
                        double diffY = lastMouseY - yPos;
-                       if (MouseButton[0]) {
+                       if (MouseButton [0]) {
                                rotY -= rotSpeed * (float)diffX;
                                rotX += rotSpeed * (float)diffY;
-                       } else if (MouseButton[1]) {
+                       } else if (MouseButton [1]) {
                                zoom += zoomSpeed * (float)diffY;
-                       }
+                       } else
+                               return;
                        updateViewRequested = true;
                }
                void buildCommandBuffers() {
@@ -143,6 +144,7 @@ namespace Triangle {
 
                protected override void OnResize () {
                        base.OnResize ();
+                       UpdateView ();
 
                        frameBuffers?.Dispose();
                        frameBuffers = pipeline.RenderPass.CreateFrameBuffers(swapChain);
index 7b90ca81801d9c8c4c80230766254c993b594200..52a3b494f67c5185d25369bdc9aaa8181d09272b 100644 (file)
@@ -88,7 +88,7 @@ namespace delaunay {
                        cfg.RenderPass.ClearValues[0] = new VkClearValue { color = new VkClearColorValue (0.0f, 0.1f, 0.0f) };
 
                        cfg.ResetShadersAndVerticesInfos ();
-                       cfg.AddShader (VkShaderStageFlags.Vertex, "#compute.FullScreenQuad.vert.spv");
+                       cfg.AddShader (VkShaderStageFlags.Vertex, "#vke.FullScreenQuad.vert.spv");
                        cfg.AddShader (VkShaderStageFlags.Fragment, "#compute.simpletexture.frag.spv");
 
                        cfg.blendAttachments[0] = new VkPipelineColorBlendAttachmentState (true);
diff --git a/samples/compute/shaders/FullScreenQuad.vert b/samples/compute/shaders/FullScreenQuad.vert
deleted file mode 100644 (file)
index 826720b..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#version 450
-
-layout (location = 0) out vec2 outUV;
-
-void main()
-{
-       outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
-       gl_Position = vec4(outUV * 2.0f + -1.0f, 0.0f, 1.0f);
-       //gl_Position = vec4(outUV -1.0f, 0.0f, 1.0f);
-}
index 6e35aed3d9dc91e24b94c782eba8545aaaa41046..3ccc4c064cebadea7a768a8f9ba618511e02f544 100644 (file)
@@ -2,6 +2,7 @@
 using System.Numerics;
 using System.Runtime.InteropServices;
 using vke;
+using vke.Environment;
 using vke.glTF;
 using Vulkan;
 
@@ -291,7 +292,7 @@ namespace deferred {
                        cfg.depthStencilState.depthWriteEnable = false;
                        using (SpecializationInfo constants = new SpecializationInfo (
                                new SpecializationConstant<uint> (0, (uint)lights.Length))) {
-                               cfg.AddShader (VkShaderStageFlags.Vertex, "#deferred.FullScreenQuad.vert.spv");
+                               cfg.AddShader (VkShaderStageFlags.Vertex, "#vke.FullScreenQuad.vert.spv");
 #if WITH_SHADOWS
                                cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.compose_with_shadows.frag.spv", constants);
 #else
index 1550b6beff12b0af59f3fc4c501a7a3d62d326a8..32f8e6a53d77380b32b906df5e2d6fdefbfcfb79 100644 (file)
@@ -1,5 +1,4 @@
 using System;
-using System.Collections.Generic;
 using System.Numerics;
 using System.Runtime.InteropServices;
 using Vulkan;
index 855e49d268ff123d8d7ff2e7451efbb55f87bb88..fc6b70ccd8a16df8adfa4e8d11f71b4b062dc256 100644 (file)
@@ -12,7 +12,7 @@
     </PropertyGroup>
     
   <ItemGroup>    
-    <Compile Include="EnvironmentPipeline.cs;DeferredPbrRenderer.cs;shadowMapRenderer.cs" />
+    <Compile Include="DeferredPbrRenderer.cs;shadowMapRenderer.cs" />
   </ItemGroup>     
 
 
@@ -37,5 +37,6 @@
   </ItemGroup>    
   <ItemGroup>
     <ProjectReference Include="..\..\addons\gltfLoader\gltfLoader.csproj" />
+               <ProjectReference Include="..\..\addons\EnvironmentPipeline\EnvironmentPipeline.csproj" />
   </ItemGroup>
 </Project>
\ No newline at end of file
index 1130f75c36dc7b40bd227c5e2b5c88fbd8f6a88a..a6073123ea660b93fe05fe81a565382ce1be7542 100644 (file)
@@ -116,7 +116,7 @@ namespace deferred {
 
                        cfg.RenderPass = new RenderPass (dev, swapChain.ColorFormat, DeferredPbrRenderer.NUM_SAMPLES);
 
-                       cfg.AddShader (VkShaderStageFlags.Vertex, "#deferred.FullScreenQuad.vert.spv");
+                       cfg.AddShader (VkShaderStageFlags.Vertex, "#vke.FullScreenQuad.vert.spv");
                        cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.tone_mapping.frag.spv");
 
                        plToneMap = new GraphicPipeline (cfg);
diff --git a/samples/deferred/shaders/FullScreenQuad.vert b/samples/deferred/shaders/FullScreenQuad.vert
deleted file mode 100644 (file)
index 826720b..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#version 450
-
-layout (location = 0) out vec2 outUV;
-
-void main()
-{
-       outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
-       gl_Position = vec4(outUV * 2.0f + -1.0f, 0.0f, 1.0f);
-       //gl_Position = vec4(outUV -1.0f, 0.0f, 1.0f);
-}
diff --git a/samples/deferred/shaders/filtercube.vert b/samples/deferred/shaders/filtercube.vert
deleted file mode 100644 (file)
index 1226e28..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#version 450
-
-layout (location = 0) in vec3 inPos;
-
-layout(push_constant) uniform PushConsts {
-       layout (offset = 0) mat4 mvp;
-} pushConsts;
-
-layout (location = 0) out vec3 outUVW;
-
-out gl_PerVertex {
-       vec4 gl_Position;
-};
-
-void main() 
-{
-       outUVW = inPos;
-       gl_Position = pushConsts.mvp * vec4(inPos.xyz, 1.0);
-}
diff --git a/samples/deferred/shaders/genbrdflut.frag b/samples/deferred/shaders/genbrdflut.frag
deleted file mode 100644 (file)
index b6290dd..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-#version 450
-
-layout (location = 0) in vec2 inUV;
-layout (location = 0) out vec4 outColor;
-layout (constant_id = 0) const uint NUM_SAMPLES = 1024u;
-
-const float PI = 3.1415926536;
-
-// Based omn http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/
-float random(vec2 co)
-{
-       float a = 12.9898;
-       float b = 78.233;
-       float c = 43758.5453;
-       float dt= dot(co.xy ,vec2(a,b));
-       float sn= mod(dt,3.14);
-       return fract(sin(sn) * c);
-}
-
-vec2 hammersley2d(uint i, uint N) 
-{
-       // Radical inverse based on http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html
-       uint bits = (i << 16u) | (i >> 16u);
-       bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
-       bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
-       bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
-       bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
-       float rdi = float(bits) * 2.3283064365386963e-10;
-       return vec2(float(i) /float(N), rdi);
-}
-
-// Based on http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_slides.pdf
-vec3 importanceSample_GGX(vec2 Xi, float roughness, vec3 normal) 
-{
-       // Maps a 2D point to a hemisphere with spread based on roughness
-       float alpha = roughness * roughness;
-       float phi = 2.0 * PI * Xi.x + random(normal.xz) * 0.1;
-       float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (alpha*alpha - 1.0) * Xi.y));
-       float sinTheta = sqrt(1.0 - cosTheta * cosTheta);
-       vec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta);
-
-       // Tangent space
-       vec3 up = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
-       vec3 tangentX = normalize(cross(up, normal));
-       vec3 tangentY = normalize(cross(normal, tangentX));
-
-       // Convert to world Space
-       return normalize(tangentX * H.x + tangentY * H.y + normal * H.z);
-}
-
-// Geometric Shadowing function
-float G_SchlicksmithGGX(float dotNL, float dotNV, float roughness)
-{
-       float k = (roughness * roughness) / 2.0;
-       float GL = dotNL / (dotNL * (1.0 - k) + k);
-       float GV = dotNV / (dotNV * (1.0 - k) + k);
-       return GL * GV;
-}
-
-vec2 BRDF(float NoV, float roughness)
-{
-       // Normal always points along z-axis for the 2D lookup 
-       const vec3 N = vec3(0.0, 0.0, 1.0);
-       vec3 V = vec3(sqrt(1.0 - NoV*NoV), 0.0, NoV);
-
-       vec2 LUT = vec2(0.0);
-       for(uint i = 0u; i < NUM_SAMPLES; i++) {
-               vec2 Xi = hammersley2d(i, NUM_SAMPLES);
-               vec3 H = importanceSample_GGX(Xi, roughness, N);
-               vec3 L = 2.0 * dot(V, H) * H - V;
-
-               float dotNL = max(dot(N, L), 0.0);
-               float dotNV = max(dot(N, V), 0.0);
-               float dotVH = max(dot(V, H), 0.0); 
-               float dotNH = max(dot(H, N), 0.0);
-
-               if (dotNL > 0.0) {
-                       float G = G_SchlicksmithGGX(dotNL, dotNV, roughness);
-                       float G_Vis = (G * dotVH) / (dotNH * dotNV);
-                       float Fc = pow(1.0 - dotVH, 5.0);
-                       LUT += vec2((1.0 - Fc) * G_Vis, Fc * G_Vis);
-               }
-       }
-       return LUT / float(NUM_SAMPLES);
-}
-
-void main() 
-{
-       outColor = vec4(BRDF(inUV.s, 1.0-inUV.t), 0.0, 1.0);
-}
\ No newline at end of file
diff --git a/samples/deferred/shaders/genbrdflut.vert b/samples/deferred/shaders/genbrdflut.vert
deleted file mode 100644 (file)
index f3dd233..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#version 450
-
-layout (location = 0) out vec2 outUV;
-
-void main()
-{
-       outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
-       gl_Position = vec4(outUV * 2.0f - 1.0f, 0.0f, 1.0f);
-}
\ No newline at end of file
diff --git a/samples/deferred/shaders/irradiancecube.frag b/samples/deferred/shaders/irradiancecube.frag
deleted file mode 100644 (file)
index 340d679..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-// Generates an irradiance cube from an environment map using convolution
-
-#version 450
-
-layout (location = 0) in vec3 inPos;
-layout (location = 0) out vec4 outColor;
-layout (binding = 0) uniform samplerCube samplerEnv;
-
-layout(push_constant) uniform PushConsts {
-       layout (offset = 64) float deltaPhi;
-       layout (offset = 68) float deltaTheta;
-} consts;
-
-#define PI 3.1415926535897932384626433832795
-
-void main()
-{
-       vec3 N = normalize(inPos);
-       vec3 up = vec3(0.0, 1.0, 0.0);
-       vec3 right = normalize(cross(up, N));
-       up = cross(N, right);
-
-       const float TWO_PI = PI * 2.0;
-       const float HALF_PI = PI * 0.5;
-
-       vec3 color = vec3(0.0);
-       uint sampleCount = 0u;
-       for (float phi = 0.0; phi < TWO_PI; phi += consts.deltaPhi) {
-               for (float theta = 0.0; theta < HALF_PI; theta += consts.deltaTheta) {
-                       vec3 tempVec = cos(phi) * right + sin(phi) * up;
-                       vec3 sampleVector = cos(theta) * N + sin(theta) * tempVec;
-                       color += texture(samplerEnv, sampleVector).rgb * cos(theta) * sin(theta);
-                       sampleCount++;
-               }
-       }
-       outColor = vec4(PI * color / float(sampleCount), 1.0);//texture(samplerEnv, inPos).rgba;
-}
diff --git a/samples/deferred/shaders/prefilterenvmap.frag b/samples/deferred/shaders/prefilterenvmap.frag
deleted file mode 100644 (file)
index ae1212e..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-#version 450
-
-layout (location = 0) in vec3 inPos;
-layout (location = 0) out vec4 outColor;
-
-layout (binding = 0) uniform samplerCube samplerEnv;
-
-layout(push_constant) uniform PushConsts {
-       layout (offset = 64) float roughness;
-       layout (offset = 68) uint numSamples;
-} consts;
-
-const float PI = 3.1415926536;
-
-// Based omn http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/
-float random(vec2 co)
-{
-       float a = 12.9898;
-       float b = 78.233;
-       float c = 43758.5453;
-       float dt= dot(co.xy ,vec2(a,b));
-       float sn= mod(dt,3.14);
-       return fract(sin(sn) * c);
-}
-
-vec2 hammersley2d(uint i, uint N) 
-{
-       // Radical inverse based on http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html
-       uint bits = (i << 16u) | (i >> 16u);
-       bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
-       bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
-       bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
-       bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
-       float rdi = float(bits) * 2.3283064365386963e-10;
-       return vec2(float(i) /float(N), rdi);
-}
-
-// Based on http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_slides.pdf
-vec3 importanceSample_GGX(vec2 Xi, float roughness, vec3 normal) 
-{
-       // Maps a 2D point to a hemisphere with spread based on roughness
-       float alpha = roughness * roughness;
-       float phi = 2.0 * PI * Xi.x + random(normal.xz) * 0.1;
-       float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (alpha*alpha - 1.0) * Xi.y));
-       float sinTheta = sqrt(1.0 - cosTheta * cosTheta);
-       vec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta);
-
-       // Tangent space
-       vec3 up = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
-       vec3 tangentX = normalize(cross(up, normal));
-       vec3 tangentY = normalize(cross(normal, tangentX));
-
-       // Convert to world Space
-       return normalize(tangentX * H.x + tangentY * H.y + normal * H.z);
-}
-
-// Normal Distribution function
-float D_GGX(float dotNH, float roughness)
-{
-       float alpha = roughness * roughness;
-       float alpha2 = alpha * alpha;
-       float denom = dotNH * dotNH * (alpha2 - 1.0) + 1.0;
-       return (alpha2)/(PI * denom*denom); 
-}
-
-vec3 prefilterEnvMap(vec3 R, float roughness)
-{
-       vec3 N = R;
-       vec3 V = R;
-       vec3 color = vec3(0.0);
-       float totalWeight = 0.0;
-       float envMapDim = float(textureSize(samplerEnv, 0).s);
-       for(uint i = 0u; i < consts.numSamples; i++) {
-               vec2 Xi = hammersley2d(i, consts.numSamples);
-               vec3 H = importanceSample_GGX(Xi, roughness, N);
-               vec3 L = 2.0 * dot(V, H) * H - V;
-               float dotNL = clamp(dot(N, L), 0.0, 1.0);
-               if(dotNL > 0.0) {
-                       // Filtering based on https://placeholderart.wordpress.com/2015/07/28/implementation-notes-runtime-environment-map-filtering-for-image-based-lighting/
-
-                       float dotNH = clamp(dot(N, H), 0.0, 1.0);
-                       float dotVH = clamp(dot(V, H), 0.0, 1.0);
-
-                       // Probability Distribution Function
-                       float pdf = D_GGX(dotNH, roughness) * dotNH / (4.0 * dotVH) + 0.0001;
-                       // Slid angle of current smple
-                       float omegaS = 1.0 / (float(consts.numSamples) * pdf);
-                       // Solid angle of 1 pixel across all cube faces
-                       float omegaP = 4.0 * PI / (6.0 * envMapDim * envMapDim);
-                       // Biased (+1.0) mip level for better result
-                       float mipLevel = roughness == 0.0 ? 0.0 : max(0.5 * log2(omegaS / omegaP) + 1.0, 0.0f);
-                       color += textureLod(samplerEnv, L, mipLevel).rgb * dotNL;
-                       totalWeight += dotNL;
-
-               }
-       }
-       return (color / totalWeight);
-}
-
-
-void main()
-{              
-       vec3 N = normalize(inPos);
-       outColor = vec4(prefilterEnvMap(N, consts.roughness), 1.0);
-}
diff --git a/samples/deferred/shaders/skybox.frag b/samples/deferred/shaders/skybox.frag
deleted file mode 100644 (file)
index e505ef1..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#version 450
-
-layout (binding = 2) uniform samplerCube samplerEnv;
-
-layout (set = 0, location = 0) in vec3 inUVW;
-
-layout (set = 0, location = 0) out vec4 outColor;
-
-void main() 
-{    
-    outColor = vec4(textureLod(samplerEnv, inUVW, 1.5).rgb, 1.0);
-}
\ No newline at end of file
diff --git a/samples/deferred/shaders/skybox.vert b/samples/deferred/shaders/skybox.vert
deleted file mode 100644 (file)
index 22e285e..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#version 450
-
-#extension GL_ARB_separate_shader_objects : enable
-#extension GL_ARB_shading_language_420pack : enable
-
-layout (location = 0) in vec3 inPos;
-
-layout (binding = 0) uniform UBO 
-{
-    mat4 projection;
-    mat4 model;
-    mat4 view;
-} ubo;
-
-layout (location = 0) out vec3 outUVW;
-
-out gl_PerVertex 
-{
-    vec4 gl_Position;
-};
-
-void main() 
-{
-    outUVW = inPos;
-    outUVW.y = -outUVW.y;        
-    gl_Position = ubo.projection * mat4(mat3(ubo.view)) * vec4(inPos, 1.0);    
-}
index a16c67ddf087c95eaa0f869e9a058f329b1584c9..8061ae72054438be2fe699493c044a80e918a4bb 100644 (file)
@@ -42,8 +42,14 @@ namespace vke {
                public DescriptorSet dsMain;
 
                public PbrModel2 model;
-               public EnvironmentCube envCube;
-
+               public vke.Environment.EnvironmentCube envCube;
+               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",
+               };
                public PBRPipeline (Queue staggingQ, RenderPass renderPass, PipelineCache pipelineCache = null) :
                        base (renderPass, pipelineCache, "pbr pipeline") {
 
@@ -87,7 +93,7 @@ namespace vke {
 
                        dsMain = descriptorPool.Allocate (descLayoutMain);
 
-                       envCube = new EnvironmentCube (dsMain, layout, staggingQ, RenderPass);
+                       envCube = new Environment.EnvironmentCube (cubemapPathes[0], dsMain, layout, staggingQ, RenderPass);
 
                        matrices.prefilteredCubeMipLevels = envCube.prefilterCube.CreateInfo.mipLevels;
                        uboMats = new HostBuffer (Dev, VkBufferUsageFlags.UniformBuffer, matrices, true);
index 7cd64f1807e247531af086c5e29b7aad01920780..abb69aef77d69f1802953c7c5b02a3b93e97f57d 100644 (file)
@@ -125,13 +125,13 @@ namespace pbrSample {
                                y += dy;
                                ctx.MoveTo (x, y);
                                ctx.ShowText (string.Format ($"{"Debug draw (numpad 0->6)",-30} : {currentDebugView.ToString ()} "));
-                               y += dy;
+                               /*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);
                        }
                }
@@ -277,6 +277,7 @@ namespace pbrSample {
 
                protected override void onKeyDown (Key key, int scanCode, Modifier modifiers) {
                        switch (key) {
+                       /*
                                case Key.F:
                                        if (modifiers.HasFlag (Modifier.Shift)) {
                                                pbrPipeline.envCube.debugFace --;
@@ -300,7 +301,7 @@ namespace pbrSample {
                                                        pbrPipeline.envCube.debugMip = 0;
                                        }
                                        queryUpdatePrefilCube = updateViewRequested = true;
-                                       break;
+                                       break;*/
                                case Key.P:
                                        showDebugImg = !showDebugImg;
                                        queryUpdatePrefilCube = updateViewRequested = true;
index 4a986e3c46e51d495b55d5e4ce2aaf89fd89d547..46f34680b1544b1e934dafa5f5b6240825a282ed 100644 (file)
   <ItemGroup>
     <ProjectReference Include="..\..\addons\gltfLoader\gltfLoader.csproj" />
     <ProjectReference Include="..\..\addons\VkvgPipeline\VkvgPipeline.csproj" />
+               <ProjectReference Include="..\..\addons\EnvironmentPipeline\EnvironmentPipeline.csproj" />
   </ItemGroup>    
   
   <ItemGroup>    
     <EmbeddedResource Include="ui\**\*.*">
       <LogicalName>deferred.%(Filename)%(Extension)</LogicalName>
     </EmbeddedResource> 
-               <None Include="shaders\**\*.*"/>
+               <None Include="shaders\**\*.*" />
   </ItemGroup>     
 
 </Project>
diff --git a/samples/pbr/shaders/FullScreenQuad.vert b/samples/pbr/shaders/FullScreenQuad.vert
deleted file mode 100644 (file)
index 826720b..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#version 450
-
-layout (location = 0) out vec2 outUV;
-
-void main()
-{
-       outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
-       gl_Position = vec4(outUV * 2.0f + -1.0f, 0.0f, 1.0f);
-       //gl_Position = vec4(outUV -1.0f, 0.0f, 1.0f);
-}
index 826720bf0b6d3839f4b27eaf459154b97017918b..52c4edc44b574eda5be44db3e4276ed796859dd2 100644 (file)
@@ -6,5 +6,4 @@ void main()
 {
        outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
        gl_Position = vec4(outUV * 2.0f + -1.0f, 0.0f, 1.0f);
-       //gl_Position = vec4(outUV -1.0f, 0.0f, 1.0f);
 }
index 1c0c877e6c5e30818fef2f85b2c0aa1ec521b8b4..46f2b86815e94aebd7b65a30a850bf0443467c92 100644 (file)
@@ -41,63 +41,64 @@ namespace vke {
                                foreach (ShaderInfo shader in cfg.shaders)
                                        shaderStages.Add (shader.GetStageCreateInfo (Dev));
 
-                               VkPipelineColorBlendStateCreateInfo colorBlendInfo = VkPipelineColorBlendStateCreateInfo.New ();
-                               colorBlendInfo.logicOpEnable = cfg.ColorBlendLogicOpEnable;
-                               colorBlendInfo.logicOp = cfg.ColorBlendLogicOp;
-                               unsafe
-                               {
-                                       colorBlendInfo.blendConstants[0] = cfg.ColorBlendConstants.X;
-                                       colorBlendInfo.blendConstants[1] = cfg.ColorBlendConstants.Y;
-                                       colorBlendInfo.blendConstants[2] = cfg.ColorBlendConstants.Z;
-                                       colorBlendInfo.blendConstants[3] = cfg.ColorBlendConstants.W;
+                               using (PinnedObjects pctx = new PinnedObjects ()) {
+
+                                       VkPipelineColorBlendStateCreateInfo colorBlendInfo = VkPipelineColorBlendStateCreateInfo.New ();
+                                       colorBlendInfo.logicOpEnable = cfg.ColorBlendLogicOpEnable;
+                                       colorBlendInfo.logicOp = cfg.ColorBlendLogicOp;
+                                       unsafe
+                                       {
+                                               colorBlendInfo.blendConstants[0] = cfg.ColorBlendConstants.X;
+                                               colorBlendInfo.blendConstants[1] = cfg.ColorBlendConstants.Y;
+                                               colorBlendInfo.blendConstants[2] = cfg.ColorBlendConstants.Z;
+                                               colorBlendInfo.blendConstants[3] = cfg.ColorBlendConstants.W;
+                                       }
+                                       colorBlendInfo.attachmentCount = (uint)cfg.blendAttachments.Count;
+                                       colorBlendInfo.pAttachments = cfg.blendAttachments.Pin (pctx);
+
+                                       VkPipelineDynamicStateCreateInfo dynStatesInfo = VkPipelineDynamicStateCreateInfo.New ();
+                                       dynStatesInfo.dynamicStateCount = (uint)cfg.dynamicStates.Count;
+                                       dynStatesInfo.pDynamicStates = cfg.dynamicStates.Pin (pctx);
+
+                                       VkPipelineVertexInputStateCreateInfo vertInputInfo = VkPipelineVertexInputStateCreateInfo.New ();
+                                       vertInputInfo.vertexBindingDescriptionCount = (uint)cfg.vertexBindings.Count;
+                                       vertInputInfo.pVertexBindingDescriptions = cfg.vertexBindings.Pin (pctx);
+                                       vertInputInfo.vertexAttributeDescriptionCount = (uint)cfg.vertexAttributes.Count;
+                                       vertInputInfo.pVertexAttributeDescriptions = cfg.vertexAttributes.Pin (pctx);
+
+                                       VkPipelineViewportStateCreateInfo viewportState = VkPipelineViewportStateCreateInfo.New ();
+                                       if (cfg.Viewports.Count > 0) {
+                                               viewportState.viewportCount = (uint)cfg.Viewports.Count;
+                                               viewportState.pViewports = cfg.Viewports.Pin (pctx);
+                                       } else
+                                               viewportState.viewportCount = 1;
+
+                                       if (cfg.Scissors.Count > 0) {
+                                               viewportState.scissorCount = (uint)cfg.Scissors.Count;
+                                               viewportState.pScissors = cfg.Scissors.Pin (pctx);
+                                       } else
+                                               viewportState.scissorCount = 1;
+
+                                       VkGraphicsPipelineCreateInfo info = VkGraphicsPipelineCreateInfo.New ();
+                                       info.renderPass = RenderPass.handle;
+                                       info.layout = Layout.handle;
+                                       info.pVertexInputState = vertInputInfo.Pin (pctx);
+                                       info.pInputAssemblyState = cfg.inputAssemblyState.Pin (pctx);
+                                       info.pRasterizationState = cfg.rasterizationState.Pin (pctx);
+                                       info.pColorBlendState = colorBlendInfo.Pin (pctx);
+                                       info.pMultisampleState = cfg.multisampleState.Pin (pctx);
+                                       info.pViewportState = viewportState.Pin (pctx);
+                                       info.pDepthStencilState = cfg.depthStencilState.Pin (pctx);
+                                       info.pDynamicState = dynStatesInfo.Pin (pctx);
+                                       info.stageCount = (uint)cfg.shaders.Count;
+                                       info.pStages = shaderStages.Pin (pctx);
+                                       info.subpass = cfg.SubpassIndex;
+
+                                       Utils.CheckResult (vkCreateGraphicsPipelines (Dev.VkDev, Cache == null ? VkPipelineCache.Null : Cache.handle, 1, ref info, IntPtr.Zero, out handle));
+
+                                       for (int i = 0; i < cfg.shaders.Count; i++)
+                                               Dev.DestroyShaderModule (shaderStages [i].module);
                                }
-                               colorBlendInfo.attachmentCount = (uint)cfg.blendAttachments.Count;
-                               colorBlendInfo.pAttachments = cfg.blendAttachments.Pin ();
-
-                               VkPipelineDynamicStateCreateInfo dynStatesInfo = VkPipelineDynamicStateCreateInfo.New ();
-                               dynStatesInfo.dynamicStateCount = (uint)cfg.dynamicStates.Count;
-                               dynStatesInfo.pDynamicStates = cfg.dynamicStates.Pin ();
-
-                               VkPipelineVertexInputStateCreateInfo vertInputInfo = VkPipelineVertexInputStateCreateInfo.New ();
-                               vertInputInfo.vertexBindingDescriptionCount = (uint)cfg.vertexBindings.Count;
-                               vertInputInfo.pVertexBindingDescriptions = cfg.vertexBindings.Pin ();
-                               vertInputInfo.vertexAttributeDescriptionCount = (uint)cfg.vertexAttributes.Count;
-                               vertInputInfo.pVertexAttributeDescriptions = cfg.vertexAttributes.Pin ();
-
-                               VkGraphicsPipelineCreateInfo info = VkGraphicsPipelineCreateInfo.New ();
-                               info.renderPass = RenderPass.handle;
-                               info.layout = Layout.handle;
-                               info.pVertexInputState = vertInputInfo.Pin ();
-                               info.pInputAssemblyState = cfg.inputAssemblyState.Pin ();
-                               info.pRasterizationState = cfg.rasterizationState.Pin ();
-                               info.pColorBlendState = colorBlendInfo.Pin ();
-                               info.pMultisampleState = cfg.multisampleState.Pin ();
-                               info.pViewportState = cfg.viewportState.Pin ();
-                               info.pDepthStencilState = cfg.depthStencilState.Pin ();
-                               info.pDynamicState = dynStatesInfo.Pin ();
-                               info.stageCount = (uint)cfg.shaders.Count;
-                               info.pStages = shaderStages.Pin ();
-                               info.subpass = cfg.SubpassIndex;
-
-                               Utils.CheckResult (vkCreateGraphicsPipelines (Dev.VkDev, Cache == null ? VkPipelineCache.Null : Cache.handle, 1, ref info, IntPtr.Zero, out handle));
-
-                               for (int i = 0; i < cfg.shaders.Count; i++)
-                                       Dev.DestroyShaderModule (shaderStages[i].module);
-
-                               vertInputInfo.Unpin ();
-                               cfg.inputAssemblyState.Unpin ();
-                               cfg.rasterizationState.Unpin ();
-                               colorBlendInfo.Unpin ();
-                               cfg.multisampleState.Unpin ();
-                               cfg.viewportState.Unpin ();
-                               cfg.depthStencilState.Unpin ();
-                               dynStatesInfo.Unpin ();
-                               shaderStages.Unpin ();
-
-                               cfg.vertexAttributes.Unpin ();
-                               cfg.vertexBindings.Unpin ();
-                               cfg.dynamicStates.Unpin ();
-                               cfg.blendAttachments.Unpin ();
                        }
                        base.Activate ();
                }
index f1e38751ebba1ab76cb38913e1c18dbdaac9791e..2b7c8d6866e049c952c5246e8e3c51f397e81578 100644 (file)
@@ -18,7 +18,8 @@ namespace vke {
                public VkPipelineBindPoint bindPoint = VkPipelineBindPoint.Graphics;
                public VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = VkPipelineInputAssemblyStateCreateInfo.New ();
                public VkPipelineRasterizationStateCreateInfo rasterizationState = VkPipelineRasterizationStateCreateInfo.New ();
-               public VkPipelineViewportStateCreateInfo viewportState = VkPipelineViewportStateCreateInfo.New ();
+               public List<VkViewport> Viewports = new List<VkViewport> ();
+               public List<VkRect2D> Scissors = new List<VkRect2D> ();
                public VkPipelineDepthStencilStateCreateInfo depthStencilState = VkPipelineDepthStencilStateCreateInfo.New ();
                public VkPipelineMultisampleStateCreateInfo multisampleState = VkPipelineMultisampleStateCreateInfo.New ();
                public List<VkPipelineColorBlendAttachmentState> blendAttachments = new List<VkPipelineColorBlendAttachmentState> ();
@@ -41,9 +42,11 @@ namespace vke {
                /// <summary>
                /// Create a default pipeline configuration with viewport and scissor as dynamic states. One blend attachment is
                /// added automatically with blending disabled. (cfg.blendAttachments[0])
+               /// If width and height parameter are omitted viewport and scissor dynamic states are automatically added, else
+               /// a viewport and a vkrect2d are added to the viewport and scissor lists.
                /// </summary>
                public static GraphicPipelineConfig CreateDefault (VkPrimitiveTopology topology = VkPrimitiveTopology.TriangleList,
-                       VkSampleCountFlags samples = VkSampleCountFlags.SampleCount1, bool depthTestEnabled = true) {
+                       VkSampleCountFlags samples = VkSampleCountFlags.SampleCount1, bool depthTestEnabled = true, int width = -1, int height = -1) {
                        GraphicPipelineConfig cfg = new GraphicPipelineConfig ();
 
                        cfg.inputAssemblyState.topology = topology;
@@ -57,13 +60,15 @@ namespace vke {
                        cfg.rasterizationState.depthBiasEnable = False;
                        cfg.rasterizationState.lineWidth = 1.0f;
 
-                       cfg.viewportState.viewportCount = 1;
-                       cfg.viewportState.scissorCount = 1;
-
                        cfg.blendAttachments.Add (new VkPipelineColorBlendAttachmentState (false));
 
-                       cfg.dynamicStates.Add (VkDynamicState.Viewport);
-                       cfg.dynamicStates.Add (VkDynamicState.Scissor);
+                       if (width < 0) {
+                               cfg.dynamicStates.Add (VkDynamicState.Viewport);
+                               cfg.dynamicStates.Add (VkDynamicState.Scissor);
+                       } else {
+                               cfg.Viewports.Add (new VkViewport { height = height, width = width, minDepth = 0f, maxDepth = 1f });
+                               cfg.Scissors.Add (new VkRect2D ((uint)width, (uint)height));
+                       }
 
                        if (depthTestEnabled) {
                                cfg.depthStencilState.depthTestEnable = True;