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.

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;

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

Saved successfully!

Ooh no, something went wrong!