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.
102 <strong>Arquitetura</strong> <strong>de</strong> interação<br />
A integração da arquitetura <strong>de</strong> interação com a arquitetura <strong>de</strong> hardware gráfico permite que os<br />
mesmos sha<strong>de</strong>rs <strong>de</strong> <strong>de</strong>formação utilizados na visualização po<strong>de</strong>m ser utilizados também para levar em<br />
consi<strong>de</strong>ração as modificações sofridas ao longo do fluxo <strong>de</strong> visualização pelos atributos geométricos<br />
necessários em manipulação direta <strong>3D</strong>. Essa estratégia evita ainda a duplicação <strong>de</strong> dados <strong>de</strong> geometria<br />
na CPU, uma vez que o mesmo mo<strong>de</strong>lo usado para visualização – armazenado em memória <strong>de</strong> ví<strong>de</strong>o<br />
local – também po<strong>de</strong> ser utilizado para o processamento <strong>de</strong> interação. Além disso, em razão do alto<br />
po<strong>de</strong>r computacional e capacida<strong>de</strong> <strong>de</strong> processamento paralelo das atuais GPUs, é possível obter um<br />
aumento no <strong>de</strong>sempenho do cálculo <strong>de</strong>sses atributos mesmo em cenas que não sofrem <strong>de</strong>formações<br />
no fluxo <strong>de</strong> visualização. Em resumo, a arquitetura proposta po<strong>de</strong> ter <strong>de</strong>sempenho superior ao obtido<br />
com o algoritmo tradicional <strong>de</strong> ray picking, mas ao mesmo tempo fornece uma solução satisfatória<br />
para o problema <strong>de</strong> interação com geometria <strong>de</strong>formada na GPU.<br />
Os atributos processados pela GPU são codificados como componentes <strong>de</strong> cor em buffers <strong>de</strong><br />
ren<strong>de</strong>rização não visíveis com formato em ponto flutuante, e <strong>de</strong>codificados pela CPU <strong>de</strong> modo a<br />
fornecer à aplicação os atributos correspon<strong>de</strong>ntes <strong>de</strong> cada pixel do mo<strong>de</strong>lo ren<strong>de</strong>rizado. Os seguintes<br />
atributos po<strong>de</strong>m ser calculados para cada vértice e interpoladas para cada fragmento:<br />
• Valor <strong>de</strong> profundida<strong>de</strong>. Profundida<strong>de</strong> do fragmento da superfície ren<strong>de</strong>rizada, em coor-<br />
<strong>de</strong>nadas relativas à janela. O cálculo <strong>de</strong>sse atributo exige a existência, na geometria origi-<br />
nal, do atributo <strong>de</strong> posição <strong>3D</strong> do vértice em coor<strong>de</strong>nadas locais (coor<strong>de</strong>nadas relativas ao<br />
espaço do objeto). Para transformações perspectivas obtidas em OpenGL com o comando<br />
glFrustum() ou gluPerspective() (da biblioteca GLU - OpenGL Utility Library),<br />
esse valor <strong>de</strong> profundida<strong>de</strong> é calculado como<br />
zwindow =<br />
<br />
Zf + Zn 2ZfZn Zfvp − Znvp<br />
+<br />
zeye(Zf − Zn) 2<br />
Zf − Zn<br />
<br />
+ Zfvp + Znvp<br />
, (5.1)<br />
2<br />
on<strong>de</strong> zeye é o valor <strong>de</strong> profundida<strong>de</strong> relativo ao espaço da câmera, e Zn e Zf correspon<strong>de</strong>m, res-<br />
pectivamente, aos valores <strong>de</strong> profundida<strong>de</strong> do plano <strong>de</strong> recorte próximo (near clipping plane) e<br />
distante (far clipping plane), também em coor<strong>de</strong>nadas relativas ao espaço da câmera. As variá-<br />
veis Znvp e Zfvp correspon<strong>de</strong>m aos valores utilizados pela API gráfica para mapear linearmente<br />
as coor<strong>de</strong>nadas <strong>de</strong> profundida<strong>de</strong> já recortadas e divididas pela coor<strong>de</strong>nada homogênea (norma-<br />
lizadas entre -1 e 1 no OpenGL, e entre 0 e 1 no Direct<strong>3D</strong>), para valores <strong>de</strong> profundida<strong>de</strong> do<br />
espaço da janela normalizados geralmente entre Znvp = 0 e Zfvp = 1, on<strong>de</strong> Znvp correspon<strong>de</strong> ao<br />
valor do plano <strong>de</strong> recorte próximo e Zfvp correspon<strong>de</strong> ao valor do plano <strong>de</strong> recorte distante. Em<br />
OpenGL, tais valores são <strong>de</strong>finidos pelo comando glDepthRange(). Em Direct<strong>3D</strong> 9.0, são<br />
<strong>de</strong>finidos através do ajuste das variáveis-membro MinZ e MaxZ da estrutura D<strong>3D</strong>VIEWPORT9,<br />
passada como parâmetro do método IDirect<strong>3D</strong>Device9::SetViewport. Para transfor-