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