...
 
Commits (2)
\section{Bisherige Arbeit} \section{Bisherige Arbeit}
\label{s:bisherigeArbeit}
% %
\subsection{Backward Raytracing} \subsection{Backward Raytracing}
\label{ss:backwardRaytracing}
\paragraph{Quelle:} J. Arvo, \gquote{Backwards ray tracing} in SIGGRAPH Course \paragraph{Quelle:} J. Arvo, \gquote{Backwards ray tracing} in SIGGRAPH Course
Notes, 1986, vol. 12, p. 100. \\ Notes, 1986, vol. 12, p. 100.
\url{https://courses.cs.washington.edu/courses/csep557/13wi/projects/trace/extra/Backward.pdf}
\paragraph{Anmerkung:} \paragraph{Anmerkung:}
Der Begriff \gquote{Backward Raytracing} wird in entgegengesetzter Bedeutung genutzt. Manche Quellen Der Begriff \gquote{Backward Raytracing} wird in entgegengesetzter Bedeutung genutzt. Manche Quellen
z.B. \url{https://de.wikipedia.org/wiki/Raytracing} z.B. \url{https://de.wikipedia.org/wiki/Raytracing}
...@@ -27,8 +28,8 @@ umsetzbar, da er sehr rechenintensiv ist. Allerdings ist der Algorithmus ein gut ...@@ -27,8 +28,8 @@ umsetzbar, da er sehr rechenintensiv ist. Allerdings ist der Algorithmus ein gut
Beleuchtung. Beleuchtung.
% %
\subsection{Realistic Real-time Underwater Caustics and Godrays} \subsection{Realistic Real-time Underwater Caustics and Godrays}
\label{ss:RealTimeUnderwaterCausticsAndGodRays}
\paragraph{Quelle:} Papadopoulos, Charilaos \& Papaioannou, Georgios. (2010). Realistic Real-time Underwater Caustics and Godrays. 19th International Conference on Computer Graphics and Vision, GraphiCon'2009 - Conference Proceedings. \paragraph{Quelle:} Papadopoulos, Charilaos \& Papaioannou, Georgios. (2010). Realistic Real-time Underwater Caustics and Godrays. 19th International Conference on Computer Graphics and Vision, GraphiCon'2009 - Conference Proceedings.
\url{http://graphics.cs.aueb.gr/graphics/docs/papers/GraphiCon09_PapadopoulosPapaioannou.pdf}
\paragraph{Technik:} \paragraph{Technik:}
Papadopoulos und Papaioannou stellen einen Algorithmus vor, der einen sehr ähnlichen Ansatz zur hier Papadopoulos und Papaioannou stellen einen Algorithmus vor, der einen sehr ähnlichen Ansatz zur hier
vorgestellten Umsetzung 2 bietet. Es wird versucht Schnittpunkte von Lichtstrahlen mit der Szene zu finden vorgestellten Umsetzung 2 bietet. Es wird versucht Schnittpunkte von Lichtstrahlen mit der Szene zu finden
...@@ -36,6 +37,7 @@ und dann Linien-Primitive von den Schnittpunkten zur Lichtquelle zu zeichnen. Al ...@@ -36,6 +37,7 @@ und dann Linien-Primitive von den Schnittpunkten zur Lichtquelle zu zeichnen. Al
Berechnung im Lightspace vorgenommen und nicht mittels Raytracing ausgeführt. Berechnung im Lightspace vorgenommen und nicht mittels Raytracing ausgeführt.
% %
\subsection{Ray Tracing Essentials Part 5: Ray Tracing Effects} \subsection{Ray Tracing Essentials Part 5: Ray Tracing Effects}
\label{ss:rayTracingEssentials}
\paragraph{Quelle:} \url{https://news.developer.nvidia.com/ray-tracing-essentials-part-5-ray-tracing-effects/} \paragraph{Quelle:} \url{https://news.developer.nvidia.com/ray-tracing-essentials-part-5-ray-tracing-effects/}
% %
In diesem Video sagt Eric Haines in Bezug auf grafische Effekte beim Raytracing: In diesem Video sagt Eric Haines in Bezug auf grafische Effekte beim Raytracing:
...@@ -55,4 +57,41 @@ als Dreiecke sondern als mathematische Definitionen vorliegen). ...@@ -55,4 +57,41 @@ als Dreiecke sondern als mathematische Definitionen vorliegen).
\paragraph{Technik:} \paragraph{Technik:}
Dieser kurze Ausschnitt des Videos stellt die Inspiration für Lösungsansatz 1 dar. Ein dichtes Dieser kurze Ausschnitt des Videos stellt die Inspiration für Lösungsansatz 1 dar. Ein dichtes
Medium wird in der Szene modelliert und wenn ein Strahl dieses Medium durchläuft wird entlang des Strahls Medium wird in der Szene modelliert und wenn ein Strahl dieses Medium durchläuft wird entlang des Strahls
die Lichtquelle gesampelt, der Strahl wird also \gquote{abgewandert}. die Lichtquelle gesampelt, der Strahl wird also \gquote{abgewandert}.
\ No newline at end of file %
\subsection{Real-time Volumetric Lighting in Participating Media}
\label{ss:realTimeVolumetricLightingInParticipatingMedia}
\paragraph{Quelle:} Tóth, Balázs und Tamás Umenhoffer. \gquote{Real-time Volumetric Lighting in Participating Media.} Eurographics (2009).
\paragraph{Technik:} Durch Light-Space-Raymarching wird die Einstreuung von Licht entlang eines Strahls
berechnet und so das finale Bild an jedem Pixel entsprechend aufgehellt. Die Verdeckungsberechnung geschieht
hierbei durch eine ShadowMap.
Im Gegensatz zu der Arbeit aus
\ref{ss:RealTimeUnderwaterCausticsAndGodRays} werden hier physikalische Aspekte beleuchtet und eine Formel zur
Berechnung der Lichtintensität vorgestellt. Diese Formel wurde letztendlich
aus der Strahlungstransportgleichung entwickelt. Die Hauptaussage dieser Gleichung ist die Ermittlung des
eingestreuten Lichtes durch Integration entlang des Strahls. Das Integral lässt dabei als endliche Summe
annähern, was letztendlich zur Überlegung führt mehrere Samples entlang des Strahls zu verrechnen.\\
Neben den physikalischen Überlegungen stellt das Paper auch
eine Effizienzüberlegung an, die in einem Raytracing-Algorithmus integriert werden könnte:
Benachbarte Pixel (im finalen Bild) stellen häufig auch nahe beieinander gelegene Raumpunkte dar.
Daraus folgt, dass für die Strahlen zu diesen Punkten auch ähnliche Einstreuungen von außen zu erwarten sind.
Anstatt für jeden Strahl $N$ Samples auszuwerten, werden nur für jeden $G \times G$ Pixel-Block $N$ Samples
ausgewertet und für den gesamten Block genutzt.
%
\subsection{Interactive Volumetric Shadows in Participating Media with Single-Scattering}
\label{interactiveVolumetricShadowsInParticipatingMediaWithSingleScattering}
\paragraph{Quelle:}C. Wyman and S. Ramsey,
\gquote{Interactive volumetric shadows in participating media with single-scattering,} 2008 IEEE Symposium on
Interactive Ray Tracing, Los Angeles, CA, 2008, pp. 87-92, doi: 10.1109/RT.2008.4634627.
\paragraph{Technik}
Wyman und Ramsey nutzen Raymarching wie Tóth und Umenhoffer (siehe
\ref{ss:realTimeVolumetricLightingInParticipatingMedia}), verbessern das Verfahren jedoch durch den Einsatz
von Schattenvolumen. Dahinter steht die Überlegung, dass Bereiche im Schatten keinen Beitrag zum eingestreuten
Licht liefern und es daher reicht, die beleuchteten Bereiche zu sampeln. Diese Technik könnte auch helfen,
beim Einsatz mit Raytracing die benötigten Sampel zu reduzieren. Jedoch erzeugt das Rendern von
Schattenvolumen auch gewisse Kosten und ist bei Szenen mit detaillierten Szenen (wie z.B. Gartenzäune) wenig
nützlich. In diesem Fall, so Wyman und Ramsey, verkommt der Algorithmus zu herkömmlichem Raymarching. Ein
anderer Aspekt ist, dass detaillierte Schatten gerade eine Stärke von Raytracing sind und der Einsatz von
Schattenvolumen diesen Vorteil ignorieren würde. Jedoch lässt sich dieser Ansatz vielleicht irgendwie
einsetzen um die Sample entlang eines Strahls \gquote{intelligenter} zu verteilen und - wie im Paper
vorgestellt - weniger redundante Samples auszuwerten.
...@@ -80,6 +80,33 @@ namespace lib ...@@ -80,6 +80,33 @@ namespace lib
None, None,
}; };
/**
* @brief Makrodefinition für den Compiler. Es können Name und Wert angegeben werden.
*/
struct CompilerMacro
{
/**
* @brief Initialisiert eine neue Instanz der Compiler Macro Klasse.
*
* @param name Der Name.
* @param value Der Wert (optional)
*/
inline CompilerMacro(std::string name, std::string value = "")
: name(name),
value(value)
{}
/**
* @brief Der Name des Makros, also der zu ersetzende Text.
*/
std::string name;
/**
* @brief Der Wert des Makros.
*/
std::string value;
};
/** /**
* @brief Enthält Optionen für die Kompilierung eines Shaders. * @brief Enthält Optionen für die Kompilierung eines Shaders.
*/ */
...@@ -89,6 +116,11 @@ namespace lib ...@@ -89,6 +116,11 @@ namespace lib
* @brief Optimierungslevel. * @brief Optimierungslevel.
*/ */
ShaderOptimizationLevel optimizationLevel = lib::IsDebug ? ShaderOptimizationLevel::Debug : ShaderOptimizationLevel::Performance; ShaderOptimizationLevel optimizationLevel = lib::IsDebug ? ShaderOptimizationLevel::Debug : ShaderOptimizationLevel::Performance;
/**
* @brief Eine Auflistung von Makros, die beim Kompilieren definiert sein sollen.
*/
std::vector<CompilerMacro> macros;
}; };
/** /**
......
...@@ -289,8 +289,7 @@ void lib::CgContext::CreateRasterizationFrameBuffers() ...@@ -289,8 +289,7 @@ void lib::CgContext::CreateRasterizationFrameBuffers()
}, },
this->swapChainImageFormat, this->swapChainImageFormat,
vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eSampled |
vk::ImageUsageFlagBits::eStorage | vk::ImageUsageFlagBits::eStorage,
vk::ImageUsageFlagBits::eColorAttachment,
vk::ImageLayout::eGeneral}; vk::ImageLayout::eGeneral};
auto newTexture = new lib::Texture{this, auto newTexture = new lib::Texture{this,
......
...@@ -11,9 +11,8 @@ ...@@ -11,9 +11,8 @@
#include "Util/Logging.hpp" #include "Util/Logging.hpp"
#include "Util/Io.hpp" #include "Util/Io.hpp"
using lib::log::Info;
using lib::log::Error; using lib::log::Error;
using lib::log::Info;
using lib::log::Warning; using lib::log::Warning;
namespace namespace
...@@ -134,6 +133,11 @@ bool lib::CompileShader(const std::string &glsl, const lib::ShaderInfo &info, li ...@@ -134,6 +133,11 @@ bool lib::CompileShader(const std::string &glsl, const lib::ShaderInfo &info, li
options.SetTargetEnvironment(shaderc_target_env_vulkan, shaderc_env_version_vulkan_1_1); options.SetTargetEnvironment(shaderc_target_env_vulkan, shaderc_env_version_vulkan_1_1);
options.SetSourceLanguage(shaderc_source_language_glsl); options.SetSourceLanguage(shaderc_source_language_glsl);
for (const auto &macro : info.compileOptions.macros)
{
options.AddMacroDefinition(macro.name, macro.value);
}
switch (info.compileOptions.optimizationLevel) switch (info.compileOptions.optimizationLevel)
{ {
case lib::ShaderOptimizationLevel::Debug: case lib::ShaderOptimizationLevel::Debug:
......