...
 
Commits (2)
\section{Bisherige Arbeit}
\label{s:bisherigeArbeit}
%
\subsection{Backward Raytracing}
\label{ss:backwardRaytracing}
\paragraph{Quelle:} J. Arvo, \gquote{Backwards ray tracing} in SIGGRAPH Course
Notes, 1986, vol. 12, p. 100. \\
\url{https://courses.cs.washington.edu/courses/csep557/13wi/projects/trace/extra/Backward.pdf}
Notes, 1986, vol. 12, p. 100.
\paragraph{Anmerkung:}
Der Begriff \gquote{Backward Raytracing} wird in entgegengesetzter Bedeutung genutzt. Manche Quellen
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
Beleuchtung.
%
\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.
\url{http://graphics.cs.aueb.gr/graphics/docs/papers/GraphiCon09_PapadopoulosPapaioannou.pdf}
\paragraph{Technik:}
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
......@@ -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.
%
\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/}
%
In diesem Video sagt Eric Haines in Bezug auf grafische Effekte beim Raytracing:
......@@ -55,4 +57,41 @@ als Dreiecke sondern als mathematische Definitionen vorliegen).
\paragraph{Technik:}
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
die Lichtquelle gesampelt, der Strahl wird also \gquote{abgewandert}.
\ No newline at end of file
die Lichtquelle gesampelt, der Strahl wird also \gquote{abgewandert}.
%
\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
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.
*/
......@@ -89,6 +116,11 @@ namespace lib
* @brief Optimierungslevel.
*/
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()
},
this->swapChainImageFormat,
vk::ImageUsageFlagBits::eSampled |
vk::ImageUsageFlagBits::eStorage |
vk::ImageUsageFlagBits::eColorAttachment,
vk::ImageUsageFlagBits::eStorage,
vk::ImageLayout::eGeneral};
auto newTexture = new lib::Texture{this,
......
......@@ -11,9 +11,8 @@
#include "Util/Logging.hpp"
#include "Util/Io.hpp"
using lib::log::Info;
using lib::log::Error;
using lib::log::Info;
using lib::log::Warning;
namespace
......@@ -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.SetSourceLanguage(shaderc_source_language_glsl);
for (const auto &macro : info.compileOptions.macros)
{
options.AddMacroDefinition(macro.name, macro.value);
}
switch (info.compileOptions.optimizationLevel)
{
case lib::ShaderOptimizationLevel::Debug:
......