Uma Arquitetura de Suporte a Interações 3D ... - DCA - Unicamp
Uma Arquitetura de Suporte a Interações 3D ... - DCA - Unicamp
Uma Arquitetura de Suporte a Interações 3D ... - DCA - Unicamp
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
76 Cálculo <strong>de</strong> elementos <strong>de</strong> geometria diferencial discreta na GPU<br />
<strong>de</strong> estimativas <strong>de</strong> elementos <strong>de</strong> primeira or<strong>de</strong>m em si. Por outro lado, é necessária para o correto<br />
funcionamento do algoritmo caso o mo<strong>de</strong>lo sofra algum tipo <strong>de</strong> <strong>de</strong>formação na GPU. Se essa<br />
<strong>de</strong>formação não existir, o mapa <strong>de</strong> posições atualizadas não precisa ser empregado, pois o mapa<br />
<strong>de</strong> posições da geometria original já conterá os atributos corretos.<br />
2. Cálculo das bases tangentes às faces: Normais às faces também são calculadas como no<br />
algoritmo <strong>de</strong> Calver [2004]. Os índices dos vértices que compõem cada face são lidos do mapa<br />
<strong>de</strong> faces e a posição <strong>3D</strong> <strong>de</strong> cada vértice é lida do mapa <strong>de</strong> posições atualizadas <strong>de</strong> vértices. O<br />
vetor normal à face (não normalizado) resultante é armazenado no mapa <strong>de</strong> normais às faces.<br />
Para calcular os vetores tangentes, é necessário acessar coor<strong>de</strong>nadas <strong>de</strong> textura para cada vértice<br />
da face. Isto é feito através da amostragem <strong>de</strong> um mapa <strong>de</strong> atributos <strong>de</strong> vértices similar ao mapa<br />
<strong>de</strong> posição <strong>de</strong> vértices, mas contendo coor<strong>de</strong>nadas <strong>de</strong> textura. Os vetores tangente e bitangente<br />
não normalizados são calculados através da solução da equação 4.3. O resultado é armazenado<br />
em um mapa <strong>de</strong> vetores tangentes às faces e um mapa <strong>de</strong> vetores bitangentes às faces.<br />
<strong>Uma</strong> vez que essas operações são executadas no mesmo sha<strong>de</strong>r, utilizamos a funcionalida<strong>de</strong><br />
<strong>de</strong> ren<strong>de</strong>rização em múltiplos alvos <strong>de</strong> ren<strong>de</strong>rização para escrever em três diferentes mapas<br />
<strong>de</strong> texturas (mapa <strong>de</strong> normais às faces, mapa <strong>de</strong> vetores tangentes às faces e mapa <strong>de</strong> vetores<br />
bitangentes às faces) ao mesmo tempo.<br />
3. Cálculo das bases tangentes aos vértices: Para cada vértice, o mapa <strong>de</strong> índices <strong>de</strong> adjacência é<br />
amostrado <strong>de</strong> modo a obter o índice da primeira face adjacente na lista <strong>de</strong> adjacência e o número<br />
<strong>de</strong> faces adjacentes. A seguir, chamamos tais dados <strong>de</strong> iFirstAdjFace e iNumAdjFace,<br />
respectivamente. Para cada face adjacente n (n ∈ [0, iNumAdjFace)), o mapa <strong>de</strong> adjacência<br />
é amostrado com relação ao índice n + iFirstAdjFace <strong>de</strong> modo a obter o índice da face<br />
adjacente que está sendo processada. Os vetores normal, tangente e bitangente à face são obti-<br />
dos dos mapas <strong>de</strong> normais às faces, vetores tangentes às faces e vetores bitangentes às faces. A<br />
soma das normais às faces é normalizada e o resultado é armazenado em um mapa <strong>de</strong> normais<br />
aos vértices. A soma dos vetores tangentes às faces é ortogonalizada com relação às normais<br />
às faces acumuladas usando o algoritmo <strong>de</strong> Gram-Schmidt. O resultado é normalizado e ar-<br />
mazenado em um mapa <strong>de</strong> vetores tangentes aos vértices. Os vetores bitangentes aos vértices<br />
não são armazenados em uma textura, pois po<strong>de</strong>m ser obtidos do produto vetorial entre os ve-<br />
tores normais e os vetores tangentes. Por outro lado, os vetores bitangentes são utilizados para<br />
se <strong>de</strong>terminar se, nesses produtos vetoriais, eles apontam na direção obtida pela regra da mão<br />
direita ou esquerda. Isso é feito com o produto vetorial N × T, comparando a sua direção com<br />
a direção do vetor bitangente acumulado. Apenas este resultado é guardado, o que requer um<br />
bit por texel (e.g., 0 para N × T, 1 para T × N). Na prática, armazenamos esta informação no