diff --git a/shaders/CMakeLists.txt b/shaders/CMakeLists.txt index 445dddf..57639e6 100644 --- a/shaders/CMakeLists.txt +++ b/shaders/CMakeLists.txt @@ -1,6 +1,8 @@ # New shaders need to be specified here in order for CMake to pickup changes -set(SHADERS shader.frag - shader.vert) +set(SHADERS deferred.frag + deferred.vert + offscreen.vert + offscreen.frag) add_custom_target( CompileShaders ALL DEPENDS ${SHADERS} diff --git a/shaders/compile.sh b/shaders/compile.sh index 9345a26..310d806 100755 --- a/shaders/compile.sh +++ b/shaders/compile.sh @@ -6,8 +6,8 @@ then else echo "Compiling shaders" # By GLSL convention we search for the following files that have the given extensions below - glslc shader.vert -o vert.spv - glslc shader.frag -o frag.spv + glslc offscreen.vert -o offscreen-vert.spv + glslc offscreen.frag -o offscreen-frag.spv glslc deferred.vert -o deferred-vert.spv glslc deferred.frag -o deferred-frag.spv fi diff --git a/shaders/deferred.frag b/shaders/deferred.frag index 1b874db..27b4b8d 100644 --- a/shaders/deferred.frag +++ b/shaders/deferred.frag @@ -1,5 +1,55 @@ #version 450 #extension GL_ARB_separate_shader_objects : enable +layout(binding = 0) uniform Camera { + mat4 model; + mat4 view; + mat4 projection; + vec3 position; +} cam; + +layout(binding = 1) uniform Light { + vec3 position; + vec3 emissiveColor; +} light; + +layout(binding = 2) uniform sampler2D texSampler; + +layout(location = 0) in vec3 fragPosition; +layout(location = 1) in vec3 fragNormal; +layout(location = 2) in vec2 fragTexCoord; + +layout(location = 0) out vec4 outColor; + +vec3 diffuse(in vec3 materialDiffuse, in vec3 normal) { + vec3 L = normalize(light.position - fragPosition); + float nDotL = max(0.0, dot(normal, L)); + + return materialDiffuse * light.emissiveColor * nDotL; +} + +vec3 specular(in vec3 materialSpecular, in vec3 normal) { + vec3 matSpec = vec3(1.0); + vec3 eyePos = normalize(cam.position); + + vec3 L = normalize(light.position - fragPosition); + vec3 V = normalize(eyePos - fragPosition); + vec3 B = normalize(L + V); + + float nDotB = max(0.0, dot(normal, B)); + + return materialSpecular * pow(nDotB, 100); +} + void main() { + vec4 matAlbedo = texture(texSampler, fragTexCoord); + vec3 diff = diffuse(matAlbedo.rgb, fragNormal); + vec3 spec = specular(matAlbedo.rgb, fragNormal); + + vec3 distanceToLight = light.position - fragPosition; + float d = length(distanceToLight); + float attenuation = clamp(10.0 / d, 0.0, 1.0); + + vec3 finalColor = attenuation * clamp(diff + spec, 0.0, 1.0); + outColor = vec4(finalColor, 1.0); // Ignore the alpha component for now } \ No newline at end of file diff --git a/shaders/deferred.vert b/shaders/deferred.vert index 27f376c..5679c25 100644 --- a/shaders/deferred.vert +++ b/shaders/deferred.vert @@ -1,6 +1,24 @@ #version 450 #extension GL_ARB_separate_shader_objects : enable +layout(binding = 0) uniform Camera { + mat4 model; + mat4 view; + mat4 projection; + vec3 position; +} cam; + +layout(location = 0) in vec3 inPosition; +layout(location = 1) in vec3 inNormal; +layout(location = 2) in vec2 inTexCoord; + +layout(location = 0) out vec3 fragPosition; +layout(location = 1) out vec3 fragNormal; +layout(location = 2) out vec2 fragTexCoord; + void main() { - gl_Position = vec4(vec3(0.0), 1.0); -} + gl_Position = cam.projection * cam.view * cam.model * vec4(inPosition, 1.0f); + fragPosition = inPosition; + fragNormal = (transpose(inverse(cam.model)) * vec4(inNormal, 1.0f)).xyz; + fragTexCoord = inTexCoord; +} \ No newline at end of file diff --git a/shaders/offscreen.frag b/shaders/offscreen.frag new file mode 100644 index 0000000..1b874db --- /dev/null +++ b/shaders/offscreen.frag @@ -0,0 +1,5 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +void main() { +} \ No newline at end of file diff --git a/shaders/offscreen.vert b/shaders/offscreen.vert new file mode 100644 index 0000000..27f376c --- /dev/null +++ b/shaders/offscreen.vert @@ -0,0 +1,6 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +void main() { + gl_Position = vec4(vec3(0.0), 1.0); +} diff --git a/shaders/shader.frag b/shaders/shader.frag deleted file mode 100644 index 27b4b8d..0000000 --- a/shaders/shader.frag +++ /dev/null @@ -1,55 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout(binding = 0) uniform Camera { - mat4 model; - mat4 view; - mat4 projection; - vec3 position; -} cam; - -layout(binding = 1) uniform Light { - vec3 position; - vec3 emissiveColor; -} light; - -layout(binding = 2) uniform sampler2D texSampler; - -layout(location = 0) in vec3 fragPosition; -layout(location = 1) in vec3 fragNormal; -layout(location = 2) in vec2 fragTexCoord; - -layout(location = 0) out vec4 outColor; - -vec3 diffuse(in vec3 materialDiffuse, in vec3 normal) { - vec3 L = normalize(light.position - fragPosition); - float nDotL = max(0.0, dot(normal, L)); - - return materialDiffuse * light.emissiveColor * nDotL; -} - -vec3 specular(in vec3 materialSpecular, in vec3 normal) { - vec3 matSpec = vec3(1.0); - vec3 eyePos = normalize(cam.position); - - vec3 L = normalize(light.position - fragPosition); - vec3 V = normalize(eyePos - fragPosition); - vec3 B = normalize(L + V); - - float nDotB = max(0.0, dot(normal, B)); - - return materialSpecular * pow(nDotB, 100); -} - -void main() { - vec4 matAlbedo = texture(texSampler, fragTexCoord); - vec3 diff = diffuse(matAlbedo.rgb, fragNormal); - vec3 spec = specular(matAlbedo.rgb, fragNormal); - - vec3 distanceToLight = light.position - fragPosition; - float d = length(distanceToLight); - float attenuation = clamp(10.0 / d, 0.0, 1.0); - - vec3 finalColor = attenuation * clamp(diff + spec, 0.0, 1.0); - outColor = vec4(finalColor, 1.0); // Ignore the alpha component for now -} \ No newline at end of file diff --git a/shaders/shader.vert b/shaders/shader.vert deleted file mode 100644 index 5679c25..0000000 --- a/shaders/shader.vert +++ /dev/null @@ -1,24 +0,0 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable - -layout(binding = 0) uniform Camera { - mat4 model; - mat4 view; - mat4 projection; - vec3 position; -} cam; - -layout(location = 0) in vec3 inPosition; -layout(location = 1) in vec3 inNormal; -layout(location = 2) in vec2 inTexCoord; - -layout(location = 0) out vec3 fragPosition; -layout(location = 1) out vec3 fragNormal; -layout(location = 2) out vec2 fragTexCoord; - -void main() { - gl_Position = cam.projection * cam.view * cam.model * vec4(inPosition, 1.0f); - fragPosition = inPosition; - fragNormal = (transpose(inverse(cam.model)) * vec4(inNormal, 1.0f)).xyz; - fragTexCoord = inTexCoord; -} \ No newline at end of file diff --git a/src/renderer.cpp b/src/renderer.cpp index 1fa07ac..6bf869c 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -655,8 +655,8 @@ void blitz::Renderer::createOffscreenFramebuffer() { void blitz::Renderer::createPipelines() { // Load our shader modules in from disk - auto vertShaderCode = ShaderLoader::load("shaders/vert.spv"); - auto fragShaderCode = ShaderLoader::load("shaders/frag.spv"); + auto vertShaderCode = ShaderLoader::load("shaders/deferred-vert.spv"); + auto fragShaderCode = ShaderLoader::load("shaders/deferred-frag.spv"); VkShaderModule vertShaderModule = createShaderModule(vertShaderCode); VkShaderModule fragShaderModule = createShaderModule(fragShaderCode);