diff --git a/data/shaders/pbribl/irradiancecube.frag b/data/shaders/pbribl/irradiancecube.frag
new file mode 100644
index 00000000..3232db48
--- /dev/null
+++ b/data/shaders/pbribl/irradiancecube.frag
@@ -0,0 +1,37 @@
+// 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);
+}
diff --git a/data/shaders/pbribl/irradiancecube.frag.spv b/data/shaders/pbribl/irradiancecube.frag.spv
new file mode 100644
index 00000000..e5d9dea3
Binary files /dev/null and b/data/shaders/pbribl/irradiancecube.frag.spv differ
diff --git a/pbribl/pbribl.cpp b/pbribl/pbribl.cpp
index 04d50e61..0bf5ef39 100644
--- a/pbribl/pbribl.cpp
+++ b/pbribl/pbribl.cpp
@@ -800,7 +800,9 @@ public:
// Pipeline layout
struct PushBlock {
glm::mat4 mvp;
- float sampleDelta = 0.05f;
+ // Sampling deltas
+ float deltaPhi = (2.0f * M_PI) / 180.0f;
+ float deltaTheta = (0.5f * M_PI) / 64.0f;
} pushBlock;
VkPipelineLayout pipelinelayout;
diff --git a/pbribl/pbribl.vcxproj b/pbribl/pbribl.vcxproj
index 30ed2a01..8c60eccf 100644
--- a/pbribl/pbribl.vcxproj
+++ b/pbribl/pbribl.vcxproj
@@ -90,8 +90,13 @@
+
+
+
+
+
diff --git a/pbribl/pbribl.vcxproj.filters b/pbribl/pbribl.vcxproj.filters
index aa086bea..63424337 100644
--- a/pbribl/pbribl.vcxproj.filters
+++ b/pbribl/pbribl.vcxproj.filters
@@ -55,5 +55,20 @@
Shaders
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
\ No newline at end of file