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.
4.1 Estimativas em superfícies discretas 65<br />
els) que são posteriormente lidas no processador <strong>de</strong> vértices. Com base nesta estratégia, o autor<br />
cria um algoritmo para calcular, diretamente na GPU, normais às faces e aos vértices após as <strong>de</strong>for-<br />
mações <strong>de</strong> geometria em relação aos vértices. A seguir <strong>de</strong>talhamos essa estratégia, que é baseada na<br />
possibilida<strong>de</strong> <strong>de</strong> usar a GPU como um processador <strong>de</strong> fluxo <strong>de</strong> propósito geral.<br />
Dados <strong>de</strong> vértices são tradicionalmente fornecidos ao processador <strong>de</strong> vértices na forma <strong>de</strong> um<br />
buffer <strong>de</strong> atributos <strong>de</strong> vértices com acesso apenas <strong>de</strong> leitura, e no qual o número e tipo <strong>de</strong> atributos<br />
são <strong>de</strong>finidos pela aplicação <strong>de</strong> acordo com um conjunto <strong>de</strong> semânticas <strong>de</strong> entrada <strong>de</strong>finidas pela<br />
API. Por exemplo, um conjunto <strong>de</strong> atributos <strong>de</strong> vértices <strong>de</strong> entrada composto por uma posição em<br />
coor<strong>de</strong>nadas homogêneas (XYZW), um vetor normal (XYZ) e coor<strong>de</strong>nadas <strong>de</strong> textura (UV) po<strong>de</strong> ser<br />
<strong>de</strong>scrito pelo código mostrado a seguir:<br />
struct VertexIn {<br />
};<br />
float4 vPos : POSITION;<br />
float3 vNormal : NORMAL;<br />
float2 vTex : TEXCOORD0;<br />
O processador <strong>de</strong> vértices acessa apenas um conjunto <strong>de</strong> atributos <strong>de</strong> vértices <strong>de</strong> cada vez, que é<br />
o conjunto <strong>de</strong> atributos do vértice que está sendo processado isoladamente em cada momento. Com<br />
GPUs compatíveis com o mo<strong>de</strong>lo <strong>de</strong> sha<strong>de</strong>r 3.0, é possível contornar esta limitação através do acesso,<br />
no processador <strong>de</strong> vértices, <strong>de</strong> dados <strong>de</strong> vértices armazenados em mapas <strong>de</strong> textura, em oposição<br />
a dados armazenados em atributos variáveis <strong>de</strong> entrada [Lefohn, 2004]. Neste caso, texturas são<br />
consi<strong>de</strong>radas como arranjos (arrays) 2D <strong>de</strong> dados <strong>de</strong> propósito geral, e a amostragem <strong>de</strong>ssas texturas<br />
é interpretada como operações <strong>de</strong> acesso aos índices <strong>de</strong> tais arranjos. Por exemplo, para uma textura<br />
RGB em formato <strong>de</strong> ponto flutuante <strong>de</strong> 128 bits por texel, cada texel po<strong>de</strong> armazenar uma posição<br />
XYZ <strong>de</strong> vértice em 32 bits, codificando cada valor numa componente <strong>de</strong> cor. Tal textura po<strong>de</strong> ser<br />
utilizada para armazenar a lista <strong>de</strong> posição dos vértices da geometria, e cada texel correspon<strong>de</strong> então à<br />
posição <strong>de</strong> um vértice. Chamamos esta textura <strong>de</strong> mapa <strong>de</strong> posição <strong>de</strong> vértices. O mesmo princípio se<br />
aplica a outros atributos <strong>de</strong> vértices, tais como normais aos vértices (mapa <strong>de</strong> normais aos vértices) e<br />
coor<strong>de</strong>nadas <strong>de</strong> textura (mapa <strong>de</strong> coor<strong>de</strong>nadas <strong>de</strong> textura). Dessa forma, em vez <strong>de</strong> utilizar a estrutura<br />
<strong>de</strong> dados tradicional <strong>de</strong> atributos <strong>de</strong> vértices para o buffer <strong>de</strong> vértices <strong>de</strong> entrada do processador <strong>de</strong><br />
vértices, apenas um atributo é utilizado para cada vértice. Este atributo é o índice unidimensional do<br />
vértice no buffer <strong>de</strong> vértices original. A estrutura <strong>de</strong> atributos <strong>de</strong> vértices <strong>de</strong> entrada é simplificada<br />
como a seguir:<br />
struct VertexIn {<br />
float iIdx : TEXCOORD0;