|
| 1 | +\documentclass[10pt,oneside,a4paper]{article} |
| 2 | +\usepackage[utf8]{inputenc} |
| 3 | +\usepackage{amsmath} |
| 4 | +\usepackage{indentfirst} |
| 5 | +\usepackage{enumitem} |
| 6 | +\usepackage[spanish]{babel} |
| 7 | +\usepackage[export]{adjustbox} |
| 8 | +\usepackage{graphicx} |
| 9 | +\graphicspath{ {img/} } |
| 10 | +\usepackage{listings} |
| 11 | +\usepackage{subfig} |
| 12 | +\usepackage{cite} |
| 13 | + |
| 14 | +\addtolength{\oddsidemargin}{-.300in} |
| 15 | +\addtolength{\evensidemargin}{-.300in} |
| 16 | +\addtolength{\textwidth}{0.600in} |
| 17 | +\addtolength{\topmargin}{-.300in} |
| 18 | +\addtolength{\textheight}{0.600in} %1.75 |
| 19 | + |
| 20 | +\begin{document} |
| 21 | +\begin{titlepage} |
| 22 | + |
| 23 | +\title{\Huge Procesadores Gráficos y Aplicaciones en Tiempo Real \\[0.7in] \LARGE Mapas de desplazamiento con niveles de detalle\\[3.6in]} |
| 24 | +\date{} |
| 25 | +\author{Álvaro Muñoz Fernández\\ |
| 26 | +Iván Velasco González} |
| 27 | +\maketitle |
| 28 | +\thispagestyle{empty} |
| 29 | +\end{titlepage} |
| 30 | + |
| 31 | +\section{Submodulo 1} |
| 32 | +\subsection{Primitivas básicas en la etapa de geometría} |
| 33 | +El objetivo de esta parte de la práctica consistía en familiarizarnos con la etapa de geometría |
| 34 | +dibujando algunas primitivas básicas. Concretamente se debe pintar los vértices que conforman un modelo, |
| 35 | +las normales de todos los vértices y por último, superponer el modelo con una representación en modo alambre. |
| 36 | + |
| 37 | +Se puede alternar entre las distintas representaciones mediante la tecla F6, que rotará entre la vista sin añadidos, la visualización de normales, la visualización de alambre y la visualización de vértices.\\ |
| 38 | + |
| 39 | +\begin{figure}[h!tbp] |
| 40 | +\centering |
| 41 | +\includegraphics[width=.6\linewidth]{pgatrimgs/Normals.png} |
| 42 | +\caption{Representación de las normales del modelo} |
| 43 | +\end{figure} |
| 44 | + |
| 45 | +Para la realización de este apartado, lo primero que se ha hecho ha sido añadir a las practicas desarrolladas en G3D(en concreto a la practica de \textit{Deferred Sahing}), |
| 46 | +la posibilidad de manejar \textit{shaders} geométricos.\\ |
| 47 | + |
| 48 | +En primer lugar, para representar los vértices que conforman un modelo cualquiera se ha programado una etapa de geometría, |
| 49 | +la cual tiene como entrada los triángulos del modelo y como salida nuevos vértices que representaran estos vértices del modelo. |
| 50 | +Una vez definidos los tipos de entrada y de salida el \textit{shader} solamente debe obtener los vértices que conforman cada triangulo, |
| 51 | +desplazarlos ligeramente en la dirección de la normal de cada uno de los vértices (para evitar \textit{Z-fighting}) y pasarlos al \textit{shader} de fragmentos para su procesado.\\ |
| 52 | + |
| 53 | +Nótese que para la realización de esta tarea también hubiese sido posible que la entrada del \textit{shader} geométrico hubiesen sido puntos. |
| 54 | +Lo cual hubiese ahorrado el procesado de algunos vértices (ya que en el caso de los triángulos están repetidos), pero hubiese sido necesaria otra pasada por el cauce para incorporar este cambio.\\ |
| 55 | + |
| 56 | +En segundo lugar, para el dibujado de las normales se ha utilizado la misma entrada que en el caso anterior, es decir, triángulos, pero se ha cambiado la salida a lineas. Ademas ha sido necesario |
| 57 | +incluir las normales como una variable de entrada propia que se obtendrá de la salida del \textit{shader} de vértices, y también ha sido necesario incluir una variable de salida que determinará el color de la primitiva.\\ |
| 58 | + |
| 59 | +Para crear las lineas que representaran las normales de los vértices, se ha obtenido la posición de cada uno de los vértices que conforman el triangulo y se ha emitido este como un vértice de la linea. El otro vértice ha sido calculado sumándole a este punto inicial la normal multiplicada por un valor de escala, siendo este vértice el final de la primitiva. Además, se ha definido el color de estos vértices como amarillo.\\ |
| 60 | + |
| 61 | +Para el caso de la normal del triángulo se han utilizado coordenadas baricéntricas para interpolar tanto la posición como las normales en el punto medio del triángulo. Una vez interpolados estos datos se ha procedido de forma similar que en el caso de los vértices, salvo que en este caso el color que se ha dado a los vértices es rojo.\\ |
| 62 | + |
| 63 | +Por último, para el dibujado del modo alambre, se ha realizado un proceso muy similar al realizado para las normales. Siendo la única diferencia que los puntos iniciales y finales de cada primitiva corresponden a los vértices del triángulo, recorriendo por tanto todas las aristas de este. Además, para evitar problemas de \textit{Z-fighting}, es necesario desplazar ligeramente |
| 64 | +los vértices emitidos por el \textit{shader} geométrico en dirección a la normal del vértice al que representan.\\ |
| 65 | + |
| 66 | +\begin{figure}[htbp] |
| 67 | +\centering |
| 68 | +\includegraphics[width=.6\linewidth]{pgatrimgs/WireFrame.png} |
| 69 | +\caption{Modo alambre} |
| 70 | +\end{figure} |
| 71 | + |
| 72 | + |
| 73 | +\subsection{\textit{Shader} de teselación} |
| 74 | +El objetivo de esta tarea consiste en familiarizarse con el \textit{shader} de teselación para subdividir una geometría dada. |
| 75 | +Para ello se ha añadido un \textit{shader} de tipo TCS (\textit{Tessellation Control Shader}), al cual se le pueden especificar los valores de subdivisión por medio de variables \textit{uniform}; |
| 76 | +y un \textit{shader} de tipo TES (\textit{Tessellation Evaluation Shader}), el cual simplemente calcula la posición del nuevo vértice interpolando con las coordenadas baricentricas proporcionadas como entrada al \textit{shader}.\\ |
| 77 | + |
| 78 | +\begin{figure}[!htb] |
| 79 | +\centering |
| 80 | + \subfloat[Triángulo]{{\includegraphics[width=.45\linewidth]{pgatrimgs/geotri.png} }}% |
| 81 | + \qquad |
| 82 | + \subfloat[Quad]{{\includegraphics[width=.45\linewidth]{pgatrimgs/geoquad.png} }}% |
| 83 | +\caption{Generación de primitivas desde shader de geometría} |
| 84 | +\end{figure} |
| 85 | + |
| 86 | +Adicionalmente se han añadido programas que, dado un punto, emplean la etapa de geometría para crear un quad o un triángulo. Utilizando la tecla F7 se activa un overlay que muestra el resultado de estas etapas, rotando entre la generación de un triángulo mediante \textit{shader} geométrica, la generación de un quad, la teselación de un triángulo y la teselación de un quad.\\ |
| 87 | + |
| 88 | +\begin{figure}[!htb] |
| 89 | +\centering |
| 90 | + \subfloat[Triángulo]{{\includegraphics[width=.45\linewidth]{pgatrimgs/tesstri1.png} }}% |
| 91 | + \qquad |
| 92 | + \subfloat[Quad]{{\includegraphics[width=.45\linewidth]{pgatrimgs/tessquad1.png} }}% |
| 93 | +\caption{Teselación de primitivas} |
| 94 | +\label{fig:tess1} |
| 95 | +\end{figure} |
| 96 | + |
| 97 | +Cabe destacar que los \textit{shader} para la teselación del triángulo y del cuadrado son muy similares, cambiando únicamente el numero de puntos que definen un \textit{patch} (4 para el caso del cuadrado y 3 para el caso del triángulo) y rellenando solo los niveles de división interna y externa necesarios para cada caso, aunque con el objetivo de simplificar la interacción se utilizan los mismos valores que los utilizados en el cuadrado. Pueden modificarse estos valores mediante las teclas 'q','w','e','r' para aumentar los niveles de teselación externa, las teclas 'a' y 's' para aumentar los niveles de teselación interna, y las mismas teclas en mayúsculas para disminuir los valores correspondientes.\\ |
| 98 | + |
| 99 | +\begin{figure}[!htb] |
| 100 | +\centering |
| 101 | + \subfloat[Triángulo]{{\includegraphics[width=.45\linewidth]{pgatrimgs/tesstri2.png} }}% |
| 102 | + \qquad |
| 103 | + \subfloat[Quad]{{\includegraphics[width=.45\linewidth]{pgatrimgs/tessquad2.png} }}% |
| 104 | +\caption{Teselación de primitivas} |
| 105 | +\label{fig:tess2} |
| 106 | +\end{figure} |
| 107 | + |
| 108 | +Probando con distintas configuraciones de niveles de detalle, hemos llegado a la conclusión que lo que parece mas interesante es mantener unos niveles de teselación interna y externa lo mas parecidos posibles para conseguir un mallado mas regular. Además en el caso del cuadrado parece que los mallados más regulares solamente se consiguen con subdivisiones múltiplo de 2. |
| 109 | + |
| 110 | +Aunque esta son nuestras apreciaciones para el problema enfrentado en esta práctica puede darse el caso de ser útil utilizar niveles de detalle muy dispares. Como en el caso de querer dividir solamente en las aristas del modelo, donde un cuadrado deberá tener gran subdivision en las caras que toquen la arista mientras que no deberá tener ninguna subdivision en la arista contraria para evitar \textit{cracks} con los cuadrados que no se subdividan al no pertenecer a una arista. |
| 111 | + |
| 112 | +En las figuras \ref{fig:tess1} y \ref{fig:tess2} puede apreciarse la diferencia al utilizar distintos valores para la teselación interna y externa. |
| 113 | + |
| 114 | + |
| 115 | +\section{Submodulo 2} |
| 116 | +\subsection{Mapas de desplazamiento} |
| 117 | +Este apartado de la practica consiste en la implementación de mapas de desplazamiento con el objetivo de dotar de mayor realismo a la geometría sin tener, por ello, tener que cargar modelos más complejos. Por lo tanto, esta parte de la práctica se divide en dos partes: por un lado en la división de la geometría en la etapa de teselación (también podría hacerse en la de geometría) y por otro lado en el desplazamiento de los vértices en sí, el cual puede realizarse tanto en la etapa de teselación (con el TES) como en el \textit{shader} de geometría. En la figura \ref{fig:disp} puede verse el resultado de aplicar este desplazamiento al elevarse las letras de la textura a partir de una esfera. \\ |
| 118 | + |
| 119 | +\begin{figure}[!htb] |
| 120 | +\centering |
| 121 | +\includegraphics[width=.6\linewidth]{pgatrimgs/Displacement.png} |
| 122 | +\caption{Mapa de desplazamiento} |
| 123 | +\label{fig:disp} |
| 124 | +\end{figure} |
| 125 | + |
| 126 | +En primer lugar, se realiza la subdivisión de la geometría indicando en el TCS unos niveles de teselación fijos (después se verá como se pueden modificar).\\ |
| 127 | + |
| 128 | +En segundo lugar se desplazan los vértices para conseguir el desplazamiento, como se ha comentado anteriormente esto puede hacerse tanto en el TES como en el \textit{shader} de geometría.\\ |
| 129 | + |
| 130 | +Suponiendo que lo hacemos en el TES el primer paso sería obtener la posición de cada punto generado por el TPG utilizando una interpolación en coordenadas baricéntricas, seguidamente utilizando el mismo método, se obtendrían tanto la normal como las coordenadas de textura de ese nuevo punto. |
| 131 | +Una vez tenemos toda esta información procedemos a leer la textura de la que obtendremos el desplazamiento y multiplicaremos el valor leído de la textura (en nuestro caso el canal verde de la textura especular) por la normal obtenida anteriormente para calcular el desplazamiento final que se aplicará al punto, siendo entonces sumado a este.\\ |
| 132 | + |
| 133 | +Nótese que para realizar este proceso es necesario definir una seria de variables de entrada que se recibirán del \textit{shader} de vértices como una serie de variables de salida que necesita el \textit{shader} de fragmentos. \\ |
| 134 | + |
| 135 | +Ahora, suponiendo que el desplazamiento se realice con el \textit{shader} de geometría el TCS permanece inalterado, ya que no interviene en este proceso, mientras que el TES solamente debe realizar la interpolación de los valores que necesitara en un futuro el \textit{shader} de fragmentos, pero sin desplazar los vértices. Una vez el TES ha pasado todos los datos interpolados al \textit{shader} de geometría, este debe definir la entrada como triángulos (la salida generada por nuestra \textit{shader} de teselación) y la salida como una tira de triángulos que definirá la malla. |
| 136 | +Por último, para desplazar los vértices en sí el proceso es completamente igual al caso del TES, simplemente se aplica el desplazamiento a cada uno de los vértices del triangulo y se conforma un nuevo triangulo con el desplazamiento.\\ |
| 137 | + |
| 138 | +Como se puede observar en la práctica al cambiar de un modo a otro (tecla F8) rel resultado es exactamente el mismo. Sin embargo, el proceso sería conveniente realizarlo en el \textit{shader} de teselación, ya que siendo el resultado idéntico nos ahorramos una etapa del cauce. |
| 139 | +\subsection{Detalle adaptativo} |
| 140 | +En este parte de la practica se propondrá una implementación para variar el nivel de detalle en función de la distancia a la camara. Más concretamente cada triángulo del objeto mostrado se dividirá en mayor o menor medida en función de esta distancia. Por lo tanto, se obtendrán distintos niveles de detalle para un mismo objeto en pantalla.\\ |
| 141 | + |
| 142 | +Para su implementación, en primer lugar se ha decidido que existirán 10 niveles de subdivisión posibles y se le asignara un nivel u otro a cada \textit{patch} (triángulos en nuestro caso, al tratarse de \textit{patches} de 3 vértices) dependiendo de su distancia a la cámara. Por lo tanto nuestro volumen de visualización está dividido en 10 zonas que permiten distintos niveles de detalle.\\ |
| 143 | + |
| 144 | +Una vez escogido el nivel de detalle adecuado este se asigna al nivel de teselación interno del triangulo, quedando los niveles de teselación externos fijados a una constante independiente de la distancia con el objetivo de evitar \textit{cracks}, ya que de caso contrario los triángulos de un mismo objeto pueden encontrarse en zonas con distinto nivel de detalle y por tanto,distintos niveles de subdivisión externa.\\ |
| 145 | + |
| 146 | +Otra posible implementación que no requiere que los niveles de teselación externos estén fijos para evitar \textit{cracks} hubiese sido la teselación adaptativa de todo el objeto en función de la distancia de este a la cámara, lo cual evita el problema de los \textit{cracks} ya que todos los triángulos del mismo objeto tendrán siempre un nivel de división externo igual. Pero en nuestro entorno en el cual la cámara esta fija esta aproximación carece de sentido, así que se ha aplicado la teselación adaptativa en función de la distancia de cada \textit{patch}.\\ |
| 147 | + |
| 148 | +La figura \ref{fig:tesscomp} muestra una comparativa de la geometría generada en el modelo dependiendo de la distancia. En el primer caso puede distinguirse una cantidad de triángulos mucho mayor en la zona de la M, al encontrarse más cerca de la cámara, que en la segunda imagen es mucho más reducida al encontrarse más alejada de la cámara. |
| 149 | + |
| 150 | +\begin{figure}[tbp] |
| 151 | +\centering |
| 152 | + \subfloat[Mayor detalle en zona desplazada]{{\includegraphics[width=.8\linewidth]{pgatrimgs/LODTessellation1.png} }}% |
| 153 | + \qquad |
| 154 | + \subfloat[Menor detalle en zona desplazada]{{\includegraphics[width=.8\linewidth]{pgatrimgs/LODTessellation2.png} }}% |
| 155 | +\caption{LOD-based Tessellation} |
| 156 | +\label{fig:tesscomp} |
| 157 | +\end{figure} |
| 158 | + |
| 159 | +\end{document} |
0 commit comments