Commit 56b143c3 authored by GERHarcos's avatar GERHarcos

Neuer MasterBranch fertig zur Abgabe

parent 13bd1247
\documentclass[]{article}
\usepackage[
colorlinks=true,
urlcolor=blue,
linkcolor=black
]{hyperref}
\usepackage[margin=0.5in]{geometry}
%opening
\date{30.12.2019}
\author{Gruppe Raytracer}
\title{Multimedia Ausarbeitung}
\begin{document}
\maketitle
%\tableofcontents
\section{Allgemeines zum Projekt}
OpenGL ist nicht für Raytracing gebaut, sondern in erster Linie für Rasterisierung. Um dieses Problem zu umgehen, erstellen wir ein Quad mit Textur, welches wir in Fenstergröße rasterisieren. Das Raytracing wird im Compute Shader erledigt, der die eigentliche Szene dann in die Textur des Quads schreibt.\\
Als Bibliotheken haben wir wie in der Übung GLFW und GLAD benutzt.\\
Wir haben in Visual Studio programmiert, weil es unter Linux größere Probleme mit der Nutzung von OpenGL 4.3 auf modernen Grafikkarten gibt, welches wir für den Compute Shader benötigen.\\
Als Programmiersprache haben wir C++ verwendet. Wir haben uns an dem C Code aus der Übung orientiert und das ganze für mehr Übersichtlichkeit objektorientiert aufgebaut. Die meisten Teile des Codes zur Initialisierung von OpenGL und der Shader konnten aus der Übung übernommen werden, allerdings wurde die C Funktion zum Einlesen der Shaderdateien neu geschrieben, sodass sie die C++ Stream Operationen nutzt.\\
%TODO falls ihr das anders macht: hier ändern
Für den \hyperref[subsec:computeShader]{Compute Shader} orientieren wir uns an einem einem \href{http://antongerdelan.net/opengl/compute.html}{Post} von Dr. Anton Gerdelan.
\subsection{Raytracing}
Raytracing ist mehr an die physikalische Beschaffenheit des Lichts angelehnt als Rasterisierung. Objekte können wie bei der Rasterisierung mithilfe von Dreiecken/ Quads beschrieben werden oder aber auch über beliebige mathematische Körper \hyperref[subsec:rt_sphere]{(in unserem Fall Sphären)}. Die Voraussetzung dafür ist, dass man berechnen kann, ob und an welchem Punkt eine Linie diesen Körper schneidet.\\
Um eine Szene zu rendern, wird pro Pixel ein Vektor (genannt Ray) mit Ursprung beim Auge und Richtung des entsprechenden Pixels im Fenster bzw. in dem near plane des Sichtfrustrums gelegt und überprüft, ob dieser Vektor auf ein Objekt in der Szene trifft und ob dieser Punkt im Frustum liegt.\\
Ab hier wird die Definition verschwommen. In vielen Beispielen zu Raytracing wird der Pixel dann direkt entsprechend der Farbe und des Materials des Körpers eingefärbt, andere Quellen nennen diesen Schritt aber "Raycasting" und sprechen erst von "Raytracing", wenn von diesem Punkt aus Vektoren zu allen Lichtquellen in der Szene gelegt werden und überprüft wird, ob sie diese treffen, bevor sie ein Objekt der Szene schneiden. Darauf basierend wird der Pixel dann schattiert.\\
Darauf aufbauend kann man auch das Material des Körpers berücksichtigen und bei Spiegelung rekursiv einen "Spiegelray" in Richtung der Spiegelung schicken, der die Farbe des gespiegelten Körpers miteinbezieht. Weiterhin gibt es durchsichtige Materialien, in denen der Ray gebrochen wird und ebenfalls rekursiv andere Rays durch den Körper schickt, deren Werte miteinfließen.\\
Wir möchten bei unserem Programm jedoch erst mal die grundsätzliche Funktionalität des raytracings mit OpenGL gewährleisten (also Rays verschicken, deren Rückgabewert die Farbe des getroffenen Körpers beziehungsweise die Hintergrundfarbe enthält) und dann eventuell in der Zukunft weiter darauf aufbauen.
\subsection{Raytracing bei Sphären}
\label{subsec:rt_sphere}
Der Ray wird als Vektor im Ursprung $U$ mit Richtung $\vec{v}$ beschrieben:\\
$x=U + t\vec{v}$, wobei
$t\in {\rm I\!R}$ und $U,v\in{\rm I\!R}^3$.\\
Eine Sphäre mit Mittelpunkt in $M=[x_0,y_0,z_0]\in{\rm I\!R}^3$ und Radius $r$ wird beschrieben mit:\\
$(x-x_0)^2 + (y-y_0)^2 + (z-z_0)^2 = r^2$\\
bzw. $||P-M|| = r^2$, also $dot((P-M), (P-M)) = r^2$ mit $P:=[x, y, z]$ als Schnittpunkt.\\
Mit einsetzen des Rays für $P$ können alle Punkte auf dem Ray gefunden werden, die die Sphäre schneiden:\\
$dot((U + t\vec{v}-M), (U + t\vec{v}-M)) = r^2$, aufgelöst ist das:
$t^2 \cdot dot(\vec{v},\vec{v}) + 2t\cdot dot(\vec{v}, U - M) + dot(U - M, U - M) - r^2 = 0$.\\
Nun bekommt man eine lineare Gleichung der Form $at^2 + bt + c = 0$ mit:\\
$a:= dot(\vec{v},\vec{v})\\
b:= 2t\cdot dot(\vec{v}, U - M)\\
c:= dot(U - M, U - M) - r^2$\\
und der Lösung $\displaystyle t_{1/2} = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$.\\
Der Teil der Lösung $b^2-4ac$ wird als \textit{Diskriminant} der Gleichung bezeichnet, für den gilt:\\
\begin{tabular}{| c | c |}
\hline
$b^2-4ac = 0$ & der Ray berührt die Sphäre einmal\\
\hline
$b^2-4ac < 0$ & der Ray schneidet die Sphäre nicht\\
\hline
$b^2-4ac > 0$ & der Ray schneidet die Sphäre mehrmals\\
\hline
\end{tabular}
\subsection{Compute Shader}
\label{subsec:computeShader}
Der Compute Shader wurde erst mit OpenGL Version 4.3 eingeführt und man kann mit ihm frei entscheiden, was auf der Grafikkarte berechnet und wie es parallelisiert wird.\\
Die Parallelisierung erfolgt über \textbf{Global Work Groups}, die jeweils unterschiedliche Aufgaben lösen und über \textbf{Local Work Groups}, welche diese Aufgabe in voneinander unabhängigen Teilaufgaben berechnen.\\
In unserem Fall haben wir eine global work group für das berechnen der Textur und \textit{Fensterbreite} $\cdot$ \textit{Fensterhöhe} local work groups - jeweils eine pro Pixel der Textur.
\section{Programmablauf}
Wir haben das ganze Programm in der Klasse \verb|rt_window| untergebracht.
\paragraph*{Initialisierung der Klasse}
Es wird entsprechend der Übung zuerst GLFW initialisiert und ein Fenster erstellt (Die Fenstergröße bleibt in unserem Programm unverändert, weil sonst immer die Textur neu erstellt werden müsste). \\
Daraufhin wird das Quad in die VertexData geschrieben. Da die Vertices in unserem Fall unverändert bleiben und es sich nur um vier Stück handelt, haben wir diesen Teil hardcoded.\\
Dann werden der Vertex- und Fragment Shader gelesen, kompiliert und zu einem Programm (\verb|programObjectNonCompute|) hinzugefügt, welches gelinked und benutzt wird.\\
Auch die Zeit wird hier initialisiert, weil wir anfangs überlegt hatten, die Zeit auszugeben, die das Programm benötigt, um einen Frame zu rendern.\\
Anschließend wird der Vertex Array, der Vertex Buffer und die Attribut Pointer für die Positionen der Vertices und der Texturkoordinaten erstellt.\\
Nachdem der Viewport und die Hintergrundfarbe gesetzt wurden, wird die Textur (Format float32 RGBA) für den Quad generiert.\\
Zuletzt wird der Compute Shader gelesen, kompiliert und zu einem eigenen Programm (\verb|programObjectCompute|) hinzugefügt.
\paragraph*{Main Loop}
Der Ablauf der Hauptschleife in OpenGL ist auch entsprechend der Übung in \verb|update()|, \verb|draw()|, \verb|glfwPollEvents()| und \verb|glfwSwapBuffers()| unterteilt.\\
\textbf{update:} Zuerst wird das Program des Compute Shaders benutzt. Der \hyperref[subsec:computeShader]{\textit{Compute Shader}} wird dann ausgeführt mit Fensterhöhe $\cdot$ Fensterbreite lokalen work groups. Sobald der Shader die Textur fertig beschrieben hat, wird die \verb|draw|-Methode aufgerufen.\\
\textbf{draw:} der Color Buffer wird auf die Ausgangsfarbe gesetzt. Nachdem das Program des Vertex- und Fragment Shaders und die Textur benutzt wird, werden die Vertices und die Textur gezeichnet.\\
\textbf{glfwPollEvents:} Beim Drücken von Escape wird der \verb|WindowShouldClose| Event getriggert.\\
\textbf{glfwSwapBuffers:} Front- und nun fertiger Backbuffer werden getauscht.
\paragraph*{Programmende/ Destruktion der Klasse:}
Der Vertex Data Array mit den Vertices des Quads, der Vertex Array und der Vertex Buffer werden gelöscht, das Fenster geschlossen und glfw wird beendet.
\end{document}
\documentclass[]{article}
\usepackage[
colorlinks=true,
urlcolor=blue,
linkcolor=black
]{hyperref}
%opening
\title{Multimedia Ausarbeitung}
\author{Gehirnzelle Nr. 3}
\begin{document}
\maketitle
\tableofcontents
\section{Allgemeines zum Projekt}
OpenGL ist nicht für Raytracing gebaut, sondern in erster Linie für Rasterisierung. Um dieses Problem zu umgehen, erstellen wir ein Quad mit Textur, welches wir in Fenstergröße rasterisieren. Das Raytracing wird im Compute Shader erledigt, der die eigentliche Szene dann in die Textur des Quads schreibt.\\
Als Bibliotheken haben wir wie in der Übung GLFW und GLAD benutzt.\\
Wir haben in Visual Studio programmiert, weil es unter Linux größere Probleme mit der Nutzung von OpenGL 4.3 auf modernen Grafikkarten gibt, welches wir für den Compute Shader benötigen.
\subsection{Raytracing}
Raytracing ist mehr an die physikalische Beschaffenheit des Lichts angelehnt als Rasterisierung. Objekte können wie bei der Rasterisierung mithilfe von Dreiecken/ Quads beschrieben werden oder aber auch über beliebige mathematische Körper (in unserem Fall Sphären) unter der Voraussetzung, dass man berechnen kann, ob und an welchem Punkt eine Linie diesen Körper schneidet.\\
Um eine Szene zu rendern, wird pro Pixel ein Vektor/ eine Linie (genannt Ray) mit Ursprung beim Auge und Richtung des entsprechenden Pixels im Fenster bzw. in dem "Near Plane"\footnote{\url{https://en.wikipedia.org/wiki/Viewing_frustum}} gelegt und überprüft, ob dieser Vektor auf ein Objekt in der Szene trifft und ob dieser Punkt im Frustum liegt.\\
Ab hier wird die Definition verschwommen. In vielen Beispielen zu Raytracing wird der Pixel dann direkt entsprechend der Farbe und des Materials des Körpers eingefärbt, andere Quellen nennen diesen Schritt aber "Raycasting" und sprechen erst von "Raytracing", wenn von diesem Punkt aus Vektoren zu allen Lichtquellen in der Szene gelegt werden und überprüft wird, ob sie diese treffen, bevor sie ein Objekt der Szene schneiden. Darauf basierend wird der Pixel dann schattiert.\\
Darauf aufbauend kann man auch das Material des Körpers berücksichtigen und bei Spiegelung rekursiv einen "Spiegelray" in Richtung der Spiegelung schicken, der die Farbe des gespiegelten Körpers miteinbezieht. Weiterhin gibt es durchsichtige Materialien, in denen der Ray gebrochen wird und ebenfalls rekursiv andere Rays durch den Körper schickt, deren Werte miteinfließen.\\
Wir möchten bei unserem Programm jedoch erst mal die grundsätzliche Funktionalität des raytracings mit OpenGL gewährleisten - also Rays verschicken, deren Rückgabewert die Farbe des getroffenen Körpers beziehungsweise die Hintergrundfarbe enthält - und dann eventuell in der Zukunft weiter darauf aufbauen.
\subsection{Compute Shader}
\label{subsec:computeShader}
Der Compute Shader wurde erst mit OpenGL Version 4.3 eingeführt und man kann mit ihm frei entscheiden, was auf der Grafikkarte berechnet und wie es parallelisiert wird.\\
Die Parallelisierung erfolgt über \textbf{Global Work Groups}, die jeweils unterschiedliche Aufgaben lösen und über \textbf{Local Work Groups}, welche diese Aufgabe in voneinander unabhängigen Teilaufgaben berechnen.\\
In unserem Fall haben wir eine global work group für das berechnen der Textur und Fensterbreite $\cdot$ Fensterhöhe local work groups - jeweils eine pro Pixel der Textur.
\section{Aufbau}
\subsection{Allgemeines}
Als Programmiersprache haben wir C++ verwendet. Wir haben uns an dem C Code aus der Übung orientiert und das ganze für mehr Übersichtlichkeit objektorientiert aufgebaut. Die meisten Teile des Codes zur Initialisierung von OpenGL und der Shader konnten aus der Übung übernommen werden, allerdings wurde die C Funktion zum Einlesen der Shaderdateien neu geschrieben, sodass sie die C++ Stream Operationen nutzt.\\
%TODO falls ihr das anders macht: hier ändern
Für den Compute Shader orientieren wir uns an einem einem \href{http://antongerdelan.net/opengl/compute.html}{Post} von Dr. Anton Gerdelan.
\subsection{Programmablauf}
Wir haben das ganze Programm in der Klasse \verb|rt_window| untergebracht.
\paragraph*{Initialisierung der Klasse}
Es wird entsprechend der Übung zuerst GLFW initialisiert und ein Fenster erstellt (Die Fenstergröße bleibt in unserem Programm unverändert, weil sonst immer die Textur neu erstellt werden müsste). \\
Daraufhin wird das Quad in die VertexData geschrieben. Da die Vertices in unserem Fall unverändert bleiben und es sich nur um vier Stück handelt, haben wir diesen Teil hardcoded.\\
Dann werden der Vertex- und Fragment Shader gelesen, kompiliert und zu einem Programm (\verb|programObjectNonCompute|) hinzugefügt, welches gelinked und benutzt wird.\\
Auch die Zeit wird hier initialisiert, weil wir anfangs überlegt hatten, die Zeit auszugeben, die das Programm benötigt, um einen Frame zu rendern.\\
Anschließend wird der Vertex Array, der Vertex Buffer und die Attribut Pointer für die Positionen der Vertices und der Texturkoordinaten erstellt.\\
Nachdem der Viewport und die Hintergrundfarbe gesetzt wurden, wird die Textur (Format float32 RGBA) für den Quad generiert.\\
Zuletzt wird der Compute Shader gelesen, kompiliert und zu einem eigenen Programm (\verb|programObjectCompute|) hinzugefügt.
\paragraph*{Main Loop}
Der Ablauf der Hauptschleife in OpenGL ist auch entsprechend der Übung in \verb|update()|, \verb|draw()|, \verb|glfwPollEvents()| und \verb|glfwSwapBuffers()| unterteilt.\\
\textbf{update:} Zuerst wird das Program des Compute Shaders benutzt. Der \hyperref[subsec:computeShader]{\textit{Compute Shader}} wird dann ausgeführt mit Fensterhöhe $\cdot$ Fensterbreite lokalen work groups. Sobald der Shader die Textur fertig beschrieben hat, wird die \verb|draw|-Methode aufgerufen.\\
\textbf{draw:} der Color Buffer wird auf die Ausgangsfarbe gesetzt. Nachdem das Program des Vertex- und Fragment Shaders und die Textur benutzt wird, werden die Vertices und die Textur gezeichnet.\\
\textbf{glfwPollEvents:} Beim Drücken von Escape wird der \verb|WindowShouldClose| Event getriggert.\\
\textbf{glfwSwapBuffers:} Front- und nun fertiger Backbuffer werden getauscht.
\paragraph*{Programmende/ Destruktion der Klasse:}
Der Vertex Data Array mit den Vertices des Quads, der Vertex Array und der Vertex Buffer werden gelöscht, das Fenster geschlossen und glfw wird beendet.
\end{document}
\relax
\providecommand\hyper@newdestlabel[2]{}
\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
\global\let\oldcontentsline\contentsline
\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
\global\let\oldnewlabel\newlabel
\gdef\newlabel#1#2{\newlabelxx{#1}#2}
\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
\AtEndDocument{\ifx\hyper@anchor\@undefined
\let\contentsline\oldcontentsline
\let\newlabel\oldnewlabel
\fi}
\fi}
\global\let\hyper@last\relax
\gdef\HyperFirstAtBeginDocument#1{#1}
\providecommand\HyField@AuxAddToFields[1]{}
\providecommand\HyField@AuxAddToCoFields[2]{}
\@writefile{toc}{\contentsline {section}{\numberline {1}Aufbau}{1}{section.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Ablauf}{1}{subsection.1.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Camera}{1}{subsection.1.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Scene}{1}{subsection.1.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {1.4}Sphere}{1}{subsection.1.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {1.5}Material}{1}{subsection.1.5}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {2}Formeln}{1}{section.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3}Algorithmen}{1}{section.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}FakedFizzleFade}{1}{subsection.3.1}\protected@file@percent }
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Arch Linux) (preloaded format=pdflatex 2019.9.18) 9 OCT 2019 14:12
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**doc.tex
(./doc.tex
LaTeX2e <2018-12-01>
(/usr/share/texmf-dist/tex/latex/base/article.cls
Document Class: article 2018/09/03 v1.4i Standard LaTeX document class
(/usr/share/texmf-dist/tex/latex/base/size10.clo
File: size10.clo 2018/09/03 v1.4i Standard LaTeX file (size option)
)
\c@part=\count80
\c@section=\count81
\c@subsection=\count82
\c@subsubsection=\count83
\c@paragraph=\count84
\c@subparagraph=\count85
\c@figure=\count86
\c@table=\count87
\abovecaptionskip=\skip41
\belowcaptionskip=\skip42
\bibindent=\dimen102
)
(/usr/share/texmf-dist/tex/latex/geometry/geometry.sty
Package: geometry 2018/04/16 v5.8 Page Geometry
(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
\KV@toks@=\toks14
)
(/usr/share/texmf-dist/tex/generic/oberdiek/ifpdf.sty
Package: ifpdf 2018/09/07 v3.3 Provides the ifpdf switch
)
(/usr/share/texmf-dist/tex/generic/oberdiek/ifvtex.sty
Package: ifvtex 2016/05/16 v1.6 Detect VTeX and its facilities (HO)
Package ifvtex Info: VTeX not detected.
)
(/usr/share/texmf-dist/tex/generic/ifxetex/ifxetex.sty
Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional
)
\Gm@cnth=\count88
\Gm@cntv=\count89
\c@Gm@tempcnt=\count90
\Gm@bindingoffset=\dimen103
\Gm@wd@mp=\dimen104
\Gm@odd@mp=\dimen105
\Gm@even@mp=\dimen106
\Gm@layoutwidth=\dimen107
\Gm@layoutheight=\dimen108
\Gm@layouthoffset=\dimen109
\Gm@layoutvoffset=\dimen110
\Gm@dimlist=\toks15
)
(/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
Package: hyperref 2018/11/30 v6.88e Hypertext links for LaTeX
(/usr/share/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty
Package: hobsub-hyperref 2016/05/16 v1.14 Bundle oberdiek, subset hyperref (HO)
(/usr/share/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty
Package: hobsub-generic 2016/05/16 v1.14 Bundle oberdiek, subset generic (HO)
Package: hobsub 2016/05/16 v1.14 Construct package bundles (HO)
Package: infwarerr 2016/05/16 v1.4 Providing info/warning/error messages (HO)
Package: ltxcmds 2016/05/16 v1.23 LaTeX kernel commands for general use (HO)
Package: ifluatex 2016/05/16 v1.4 Provides the ifluatex switch (HO)
Package ifluatex Info: LuaTeX not detected.
Package hobsub Info: Skipping package `ifvtex' (already loaded).
Package: intcalc 2016/05/16 v1.2 Expandable calculations with integers (HO)
Package hobsub Info: Skipping package `ifpdf' (already loaded).
Package: etexcmds 2016/05/16 v1.6 Avoid name clashes with e-TeX commands (HO)
Package: kvsetkeys 2016/05/16 v1.17 Key value parser (HO)
Package: kvdefinekeys 2016/05/16 v1.4 Define keys (HO)
Package: pdftexcmds 2018/09/10 v0.29 Utility functions of pdfTeX for LuaTeX (HO
)
Package pdftexcmds Info: LuaTeX not detected.
Package pdftexcmds Info: \pdf@primitive is available.
Package pdftexcmds Info: \pdf@ifprimitive is available.
Package pdftexcmds Info: \pdfdraftmode found.
Package: pdfescape 2016/05/16 v1.14 Implements pdfTeX's escape features (HO)
Package: bigintcalc 2016/05/16 v1.4 Expandable calculations on big integers (HO
)
Package: bitset 2016/05/16 v1.2 Handle bit-vector datatype (HO)
Package: uniquecounter 2016/05/16 v1.3 Provide unlimited unique counter (HO)
)
Package hobsub Info: Skipping package `hobsub' (already loaded).
Package: letltxmacro 2016/05/16 v1.5 Let assignment for LaTeX macros (HO)
Package: hopatch 2016/05/16 v1.3 Wrapper for package hooks (HO)
Package: xcolor-patch 2016/05/16 xcolor patch
Package: atveryend 2016/05/16 v1.9 Hooks at the very end of document (HO)
Package atveryend Info: \enddocument detected (standard20110627).
Package: atbegshi 2016/06/09 v1.18 At begin shipout hook (HO)
Package: refcount 2016/05/16 v3.5 Data extraction from label references (HO)
Package: hycolor 2016/05/16 v1.8 Color options for hyperref/bookmark (HO)
)
(/usr/share/texmf-dist/tex/latex/oberdiek/auxhook.sty
Package: auxhook 2016/05/16 v1.4 Hooks for auxiliary files (HO)
)
(/usr/share/texmf-dist/tex/latex/oberdiek/kvoptions.sty
Package: kvoptions 2016/05/16 v3.12 Key value format for package options (HO)
)
\@linkdim=\dimen111
\Hy@linkcounter=\count91
\Hy@pagecounter=\count92
(/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
File: pd1enc.def 2018/11/30 v6.88e Hyperref: PDFDocEncoding definition (HO)
Now handling font encoding PD1 ...
... no UTF-8 mapping file for font encoding PD1
)
\Hy@SavedSpaceFactor=\count93
(/usr/share/texmf-dist/tex/latex/latexconfig/hyperref.cfg
File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive
)
Package hyperref Info: Hyper figures OFF on input line 4519.
Package hyperref Info: Link nesting OFF on input line 4524.
Package hyperref Info: Hyper index ON on input line 4527.
Package hyperref Info: Plain pages OFF on input line 4534.
Package hyperref Info: Backreferencing OFF on input line 4539.
Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
Package hyperref Info: Bookmarks ON on input line 4772.
\c@Hy@tempcnt=\count94
(/usr/share/texmf-dist/tex/latex/url/url.sty
\Urlmuskip=\muskip10
Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
)
LaTeX Info: Redefining \url on input line 5125.
\XeTeXLinkMargin=\dimen112
\Fld@menulength=\count95
\Field@Width=\dimen113
\Fld@charsize=\dimen114
Package hyperref Info: Hyper figures OFF on input line 6380.
Package hyperref Info: Link nesting OFF on input line 6385.
Package hyperref Info: Hyper index ON on input line 6388.
Package hyperref Info: backreferencing OFF on input line 6395.
Package hyperref Info: Link coloring OFF on input line 6400.
Package hyperref Info: Link coloring with OCG OFF on input line 6405.
Package hyperref Info: PDF/A mode OFF on input line 6410.
LaTeX Info: Redefining \ref on input line 6450.
LaTeX Info: Redefining \pageref on input line 6454.
\Hy@abspage=\count96
\c@Item=\count97
\c@Hfootnote=\count98
)
Package hyperref Info: Driver (autodetected): hpdftex.
(/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
File: hpdftex.def 2018/11/30 v6.88e Hyperref driver for pdfTeX
\Fld@listcount=\count99
\c@bookmark@seq@number=\count100
(/usr/share/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty
Package: rerunfilecheck 2016/05/16 v1.8 Rerun checks for auxiliary files (HO)
Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
82.
)
\Hy@SectionHShift=\skip43
)
(/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK)
(/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
File: color.cfg 2016/01/02 v1.6 sample color configuration
)
Package xcolor Info: Driver file: pdftex.def on input line 225.
(/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex
)
Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348.
Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352.
Package xcolor Info: Model `RGB' extended on input line 1364.
Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366.
Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367.
Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368.
Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369.
Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370.
Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371.
) (./doc.aux)
\openout1 = `doc.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 14.
LaTeX Font Info: ... okay on input line 14.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 14.
LaTeX Font Info: ... okay on input line 14.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 14.
LaTeX Font Info: ... okay on input line 14.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 14.
LaTeX Font Info: ... okay on input line 14.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 14.
LaTeX Font Info: ... okay on input line 14.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 14.
LaTeX Font Info: ... okay on input line 14.
LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 14.
LaTeX Font Info: ... okay on input line 14.
*geometry* driver: auto-detecting
*geometry* detected driver: pdftex
*geometry* verbose mode - [ preamble ] result:
* driver: pdftex
* paper: <default>
* layout: <same size as paper>
* layoutoffset:(h,v)=(0.0pt,0.0pt)
* modes:
* h-part:(L,W,R)=(36.135pt, 542.02501pt, 36.135pt)
* v-part:(T,H,B)=(36.135pt, 722.7pt, 36.135pt)
* \paperwidth=614.295pt
* \paperheight=794.96999pt
* \textwidth=542.02501pt
* \textheight=722.7pt
* \oddsidemargin=-36.135pt
* \evensidemargin=-36.135pt
* \topmargin=-73.135pt
* \headheight=12.0pt
* \headsep=25.0pt
* \topskip=10.0pt
* \footskip=30.0pt
* \marginparwidth=65.0pt
* \marginparsep=11.0pt
* \columnsep=10.0pt
* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
* \hoffset=0.0pt
* \voffset=0.0pt
* \mag=1000
* \@twocolumnfalse
* \@twosidefalse
* \@mparswitchfalse
* \@reversemarginfalse
* (1in=72.27pt=25.4mm, 1cm=28.453pt)
\AtBeginShipoutBox=\box27
Package hyperref Info: Link coloring OFF on input line 14.
(/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
Package: nameref 2016/05/21 v2.44 Cross-referencing by name of section
(/usr/share/texmf-dist/tex/generic/oberdiek/gettitlestring.sty
Package: gettitlestring 2016/05/16 v1.5 Cleanup title references (HO)
)
\c@section@level=\count101
)
LaTeX Info: Redefining \ref on input line 14.
LaTeX Info: Redefining \pageref on input line 14.
LaTeX Info: Redefining \nameref on input line 14.
(./doc.out)
(./doc.out)
\@outlinefile=\write3
\openout3 = `doc.out'.
(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
\scratchcounter=\count102
\scratchdimen=\dimen115
\scratchbox=\box28
\nofMPsegments=\count103
\nofMParguments=\count104
\everyMPshowfont=\toks16
\MPscratchCnt=\count105
\MPscratchDim=\dimen116
\MPnumerator=\count106
\makeMPintoPDFobject=\count107
\everyMPtoPDFconversion=\toks17
)
LaTeX Font Info: External font `cmex10' loaded for size
(Font) <12> on input line 16.
LaTeX Font Info: External font `cmex10' loaded for size
(Font) <8> on input line 16.
LaTeX Font Info: External font `cmex10' loaded for size
(Font) <6> on input line 16.
LaTeX Font Info: Try loading font information for OMS+cmr on input line 21.
(/usr/share/texmf-dist/tex/latex/base/omscmr.fd
File: omscmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions
)
LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available
(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 21.
LaTeX Font Info: External font `cmex10' loaded for size
(Font) <7> on input line 21.
LaTeX Font Info: External font `cmex10' loaded for size
(Font) <5> on input line 21.
Package atveryend Info: Empty hook `BeforeClearDocument' on input line 49.
[1
{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}]
Package atveryend Info: Empty hook `AfterLastShipout' on input line 49.
(./doc.aux)
Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 49.
Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 49.
Package rerunfilecheck Info: File `doc.out' has not changed.
(rerunfilecheck) Checksum: 386DC33A37A7C1412D9C07F41B027B4B;469.
Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 49.
)
Here is how much of TeX's memory you used:
5605 strings out of 492623
81055 string characters out of 6135669
180079 words of memory out of 5000000
9499 multiletter control sequences out of 15000+600000
8409 words of font info for 30 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
28i,6n,35p,683b,323s stack positions out of 5000i,500n,10000p,200000b,80000s
</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></usr/share/
texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf-dist/fon
ts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-dist/fonts/type1/public
/amsfonts/cm/cmr12.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cm
r17.pfb></usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/
share/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/share/texmf-di
st/fonts/type1/public/amsfonts/cm/cmtt10.pfb>
Output written on doc.pdf (1 page, 105671 bytes).
PDF statistics:
85 PDF objects out of 1000 (max. 8388607)
73 compressed objects within 1 object stream
11 named destinations out of 1000 (max. 500000)
73 words of extra memory for PDF output out of 10000 (max. 10000000)
\BOOKMARK [1][-]{section.1}{Aufbau}{}% 1
\BOOKMARK [2][-]{subsection.1.1}{Ablauf}{section.1}% 2
\BOOKMARK [2][-]{subsection.1.2}{Camera}{section.1}% 3
\BOOKMARK [2][-]{subsection.1.3}{Scene}{section.1}% 4
\BOOKMARK [2][-]{subsection.1.4}{Sphere}{section.1}% 5
\BOOKMARK [2][-]{subsection.1.5}{Material}{section.1}% 6
\BOOKMARK [1][-]{section.2}{Formeln}{}% 7
\BOOKMARK [1][-]{section.3}{Algorithmen}{}% 8
\BOOKMARK [2][-]{subsection.3.1}{FakedFizzleFade}{section.3}% 9
\documentclass[]{article}
\usepackage[margin=0.5in]{geometry}
\usepackage[hidelinks]{hyperref}
\usepackage{xcolor}
%opening
\title{Dokumentation Raytracer-Projekt für Multimedia}
\author{Brian Philipp, Patrick Mark, Baldur Paulwitz}
\date{\today}
\setlength\parindent{0pt}
\begin{document}
\maketitle
\section{Aufbau}
\subsection{Ablauf}
\textit{Programmablauf}
\begin{itemize}
\item Initialisieren $\rightarrow$ Objekte in Shader Buffer
\item Quad mit Größe der Bildschirmauflösung erstellen
\item Spheren auf das Quad raytracen mit Compute Shader (\textbf{mindestens OpenGL Version 4.3})
\item Quad auf Bildschirm 'normal' rasterizern
\end{itemize}
\subsection{Camera}
\textit{Stellt Kameraposition und -rotation dar.}
\subsection{Scene}
\textit{Enthält alle Szenenobjekte. Eine Szene muss immer eine Kamera besitzen.}
\subsection{Sphere}
\textit{Kugel, die in der Szene gerendert werden kann.}
\subsection{Material}
\textit{Beschreibt die Oberfläche eines Szenenobjekts.}
\section{Formeln}
\section{Algorithmen}
\textcolor{gray}{
\subsection{FakedFizzleFade}
Kann genutzt werden, um deterministisch jeden Pixel im Bild einigermaßen gleichmäßig verteilt genau einmal zu rendern. $\rightarrow$ macht eventuell flüssigere Bewegung möglich?\\
Das Spiel Wolfenstein 3D hat einen sogenannten FizzleFade effekt genutzt, um jeden Pixel im Bild genau einmal pseudo-random zu wählen und zu Färben (\textcolor{blue}{\url{http://fabiensanglard.net/fizzlefade/index.php}}). Man kann das umständlicher für beliebige Auflösungen simulieren, indem man einen Array der Länge Length = Bildhöhe $\cdot$ Bildbreite erstellt und mit zufälligen Werten initialisiert. Der Array wird sortiert und ein zweiter der gleichen Länge mit dem jeweiligen Index als Inhalt angelegt, welcher auf die gleiche Art wie der 1. sortiert wird. Nun kann man beim rendern des Bildes durch den 2. Array iterieren und den jeweiligen Ray casten.\\
\textcolor{red}{$\rightarrow$ unnötig, da wir sowieso im Shader die Rays parallel casten}
}
\end{document}
\ No newline at end of file
CC = gcc
CFLAGS = -c -Wall -O3 -Iinclude
LD = $(CC)
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
LDFLAGS = -Lsrc -lglfw3 -framework AppKit -framework IOKit -framework CoreVideo
else
LDFLAGS = -Lsrc -lglfw -lm -lX11 -lpthread -ldl
endif
TARGET = raytracer
OBJECTS = $(patsubst %.c, %.o, $(wildcard src/*.c))
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(LD) -o $@ $^ $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) $^ -o $@
clean:
rm -rf $(TARGET) $(OBJECTS)
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
int main(int argc, char const* argv[]) int main(int argc, char const* argv[])
{ {
int width = 640; int width = 1024;
int height = 480; int height = 768;
//set width and height according to input parameters //set width and height according to input parameters
if (argc == 3) if (argc == 3)
...@@ -20,7 +20,7 @@ int main(int argc, char const* argv[]) ...@@ -20,7 +20,7 @@ int main(int argc, char const* argv[])
if (int inHeight = atoi(argv[1]) < 10000) if (int inHeight = atoi(argv[1]) < 10000)
{ {
if (inHeight < 0) if (inHeight < 0 && inHeight > -10000)
width = -inHeight; width = -inHeight;
} }
} }
......
/*#version 430
layout (local_size_x = 1, local_size_y = 1) in;
layout (rgba32f, binding = 0) uniform image2D img_output;
void main () {
// INIT
// Set a Standard-Color for non-Hitted Points
vec4 pixel = vec4 (1.0, 0.0, 0.0, 1.0);
// Sphere-Attributes
vec3 sphere_center = vec3 (0.0, 0.0, -10.0);
float sphere_radius = 3;
// Scale-Values for our ray-ortho
float max_x = 5.0;
float max_y = 5.0;
// That is the Position on Screen where we will draw the Pixel to, we query the Dimensions too