diff --git a/config/ext/IncludeShader.cmake b/config/ext/IncludeShader.cmake
index 7eea0df42da0f1f3ceebd6b0fa3498127cf63976..e67a8716fb32a953c93a3c6624f0d459a025e950 100644
--- a/config/ext/IncludeShader.cmake
+++ b/config/ext/IncludeShader.cmake
@@ -1,41 +1,75 @@
 
 function(include_shader shader include_dir source_dir)
-	get_filename_component(filename ${shader} NAME)
-	file(SIZE ${shader} filesize)
-	
-	string(TOUPPER ${filename} varname)
-	string(REPLACE "." "_" varname ${varname})
-	
-	set(shader_header "")
-	string(APPEND shader_header "#pragma once\n")
-	string(APPEND shader_header "extern unsigned char ${varname} [${filesize}]\;\n")
-	string(APPEND shader_header "extern unsigned int ${varname}_LEN\;\n")
-	string(APPEND shader_header "const std::string ${varname}_SHADER (reinterpret_cast<const char*>(${varname}), ${varname}_LEN)\;")
-	
-	set(shader_source "")
-	string(APPEND shader_source "unsigned char ${varname}[] = {")
-	
-	math(EXPR max_fileoffset "${filesize} - 1" OUTPUT_FORMAT DECIMAL)
-	
-	foreach(fileoffset RANGE ${max_fileoffset})
-		file(READ ${shader} shader_source_byte OFFSET ${fileoffset} LIMIT 1 HEX)
+	if (NOT EXISTS ${shader})
+		message(WARNING "Shader file does not exist: ${shader}")
+	else()
+		get_filename_component(filename ${shader} NAME)
+		file(SIZE ${shader} filesize)
 		
-		math(EXPR offset_modulo "${fileoffset} % 12" OUTPUT_FORMAT DECIMAL)
+		set(include_target_file ${include_dir}/${filename}.hxx)
+		set(source_target_file ${source_dir}/${filename}.cxx)
 		
-		if (${offset_modulo} EQUAL 0)
-			string(APPEND shader_source "\n  ")
+		if ((EXISTS ${source_target_file}) AND (EXISTS ${include_target_file}))
+			file(TIMESTAMP ${shader} shader_timestamp "%Y-%m-%dT%H:%M:%S")
+			file(TIMESTAMP ${source_target_file} source_timestamp "%Y-%m-%dT%H:%M:%S")
+			
+			string(COMPARE GREATER ${shader_timestamp} ${source_timestamp} shader_update)
+		else()
+			set(shader_update true)
 		endif()
 		
-		if (${fileoffset} LESS ${max_fileoffset})
-			string(APPEND shader_source "0x${shader_source_byte}, ")
-		else()
-			string(APPEND shader_source "0x${shader_source_byte}\n")
+		if (shader_update)
+			string(TOUPPER ${filename} varname)
+			string(REPLACE "." "_" varname ${varname})
+			
+			set(shader_header "#pragma once\n")
+			string(APPEND shader_header "// This file is auto-generated via cmake, so don't touch it!\n")
+			string(APPEND shader_header "extern unsigned char ${varname} [${filesize}]\;\n")
+			string(APPEND shader_header "extern unsigned int ${varname}_LEN\;\n")
+			string(APPEND shader_header "const std::string ${varname}_SHADER (reinterpret_cast<const char*>(${varname}), ${varname}_LEN)\;")
+			
+			file(WRITE ${include_target_file} ${shader_header})
+			
+			find_program(xxd_program "xxd")
+			
+			if (EXISTS ${xxd_program})
+				get_filename_component(shader_directory ${shader} DIRECTORY)
+				
+				add_custom_command(
+						OUTPUT ${source_target_file}
+						WORKING_DIRECTORY "${shader_directory}"
+						COMMAND xxd -i -C "${filename}" "${source_target_file}"
+						COMMENT "Processing shader into source files: ${shader}"
+				)
+			else()
+				set(shader_source "// This file is auto-generated via cmake, so don't touch it!\n")
+				string(APPEND shader_source "unsigned char ${varname}[] = {")
+				
+				math(EXPR max_fileoffset "${filesize} - 1" OUTPUT_FORMAT DECIMAL)
+				
+				message(STATUS "Processing shader into source files: ${shader}")
+				
+				foreach(fileoffset RANGE ${max_fileoffset})
+					file(READ ${shader} shader_source_byte OFFSET ${fileoffset} LIMIT 1 HEX)
+					
+					math(EXPR offset_modulo "${fileoffset} % 12" OUTPUT_FORMAT DECIMAL)
+					
+					if (${offset_modulo} EQUAL 0)
+						string(APPEND shader_source "\n  ")
+					endif()
+					
+					if (${fileoffset} LESS ${max_fileoffset})
+						string(APPEND shader_source "0x${shader_source_byte}, ")
+					else()
+						string(APPEND shader_source "0x${shader_source_byte}\n")
+					endif()
+				endforeach()
+				
+				string(APPEND shader_source "}\;\n")
+				string(APPEND shader_source "unsigned int ${varname}_LEN = ${filesize}\;")
+				
+				file(WRITE ${source_target_file} ${shader_source})
+			endif()
 		endif()
-	endforeach()
-	
-	string(APPEND shader_source "}\;\n")
-	string(APPEND shader_source "unsigned int ${varname}_LEN = ${filesize}\;")
-	
-	file(WRITE ${include_dir}/${filename}.hxx ${shader_header})
-	file(WRITE ${source_dir}/${filename}.cxx ${shader_source})
+	endif()
 endfunction()