03.04.2013 Views

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

SHOW MORE
SHOW LESS

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-

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!