• Nenhum resultado encontrado

5.4 Fluxo de processamento

5.4.1 Estágios de processamento

Os estágios de processamento são integrados ao laço de visualização da aplicação. Essa integração é mostrada na figura 5.10. Imediatamente antes de chamar a GPU para a renderização da geometria no laço de renderização, a aplicação invoca um comando Render() da arquitetura de interação que, internamente, dispara os três passos de renderização relacionados aos estágios 1, 2, 3, 4 e 5. Após a renderização da geometria para fins de visualização, a aplicação requisita o conteúdo dos buffers de renderização não visíveis (estágio 6) através da chamada do comando Decode(). Cada um desses seis estágios é detalhado a seguir. Por convenção, os procedimentos na figura 5.10 são exibidos como retângulos de bordas arredondadas, enquanto os repositórios de dados são exibidos como retângulos: 1. Modificação de atributos de vértices. Esse estágio é executado caso o modelo original

sofra alterações de seus atributos de vértices na GPU por funções de deformação definidas pela aplicação. Para cada modelo geométrico sob interação, esse procedimento é iniciado pela arquitetura através da chamada de uma função de chamada de retorno (callback) previ- amente definida pela aplicação através da interface entre a aplicação e a arquitetura de inte- ração, e que contém o comando de renderização do modelo segundo a API utilizada (e.g.,

DrawIndexedPrimitive()no Direct3D, ou glDrawArrays(), glBegin() e

glEnd()no OpenGL). Tais funções recebem como parâmetro o buffer de vértices da geome- tria original, não deformada.

No processador de vértices, funções de deformação definidas pela aplicação modificam os atri- butos originais dos vértices e produzem a geometria final que será utilizada no cálculo da es- timativa das propriedades geométricas do modelo. Para esse propósito, a geometria resultante ainda é produzida no sistema de coordenadas do espaço do objeto. Os atributos do modelo deformado são armazenados em texturas para uso posterior. Técnicas como mapeamento de deslocamento por vértice e mesh skinning são executadas neste estágio, da mesma forma que quaisquer outros shaders que modifiquem, com relação aos vértices, os atributos de geometria utilizados no cálculo de propriedades de geometria diferencial e bases do espaço de textura (atributos de posição 3D e coordenadas de textura).

2. Cálculo de atributos geométricos. Se a tarefa de interação demanda dados geométricos que não foram fornecidos como atributos dos vértices da geometria original (e.g., vetor normal, cur- vaturas, direções principais, bases tangentes calculadas segundo o mapeamento de coordenadas de textura), ou que foram modificados no estágio de modificação de atributos de vértices, tais dados são calculados neste estágio de modo a levar em consideração a geometria deformada. A estimativa das propriedades de geometria diferencial é realizada para cada vértice do modelo, sempre após o estágio de modificação de atributos dos vértices. Assim como no estágio ante- rior, esse procedimento é disparado internamente pela arquitetura através da chamada de uma função de chamada de retorno contendo o comando de renderização do modelo com o buffer de vértices do modelo original. Para cada vértice, a GPU lê os atributos modificados do vértice através da amostragem de texturas de renderização utilizadas no estágio anterior e através da amostragem de texturas pré-computadas contendo dados de conectividade da geometria. Os resultados obtidos (atributos geométricos) são novamente gravados em texturas.

3. Modificação de atributos de vértices. A funcionalidade deste estágio é semelhante a do primeiro estágio. No shader de vértices, as texturas contendo os atributos da geometria de- formada, obtidas dos estágios anteriores, são amostradas de modo a atualizar os atributos da geometria original. Desse modo, cada vértice possui atributos adicionais de geometria diferen-

5.4 Fluxo de processamento 113 cial calculados no estágio anterior. Tais atributos podem ser modificados arbitrariamente neste estágio antes de serem interpolados para cada fragmento durante a rasterização.

A inclusão deste estágio de modificação de atributos de vértices é justificada pela necessidade de dar mais flexibilidade aos tipos de transformações geométricas utilizadas no processador de vértices. Por exemplo, tal estágio é necessário para realizar tarefas tais como transformar bases tangentes recém calculadas, do sistema de coordenadas local do modelo para o sistema de coordenadas global. Como tais bases tangentes não são conhecidas no primeiro estágio, este tipo de processamento só pode ser realizado após as estimativas.

4. Modificação de atributos de fragmentos. Após projetar e rasterizar a geometria resultante dos estágios anteriores, os atributos interpolados dos fragmentos podem ser modificados. Durante a rasterização, a GPU realiza uma interpolação linear dos atributos dos vértices ao longo das primitivas. No shader de fragmentos correspondente a este estágio, os atributos interpolados podem ser modificados por uma função definida pela aplicação. Se essa função modificar atributos de posição e orientação de tal forma a requerer uma nova estimativa das propriedades de geometria diferencial, cabe à aplicação a tarefa de atualizar tais propriedades. Isso ocorre porque o estágio de estimativa de atributos geométricos é realizado apenas com relação aos vértices e não com relação aos fragmentos.

Exemplos de processamento realizado neste estágio incluem as técnicas de mapeamento de detalhes 3D, execução de filtros de processamento de imagem e descarte de fragmentos. Além disso, texturas contendo atributos definidos pela aplicação podem ser amostradas neste estágio de modo a obter novos atributos, a critério da aplicação.

Assim como nos estágios de deformação com relação aos vértices, este estágio é disparado in- ternamente pela arquitetura através da chamada de uma função de chamada de retorno definida pela aplicação e que contém o comando de renderização do modelo segundo a API utilizada. 5. Codificação de atributos. Este procedimento é realizado no mesmo shader de fragmentos

do estágio anterior. Os atributos definidos para cada fragmento a partir da interpolação dos fragmentos dos vértices, possivelmente modificados pelo estágio de modificação de atributos de fragmentos, são codificados como componentes de cor em buffers de renderização não visíveis. A funcionalidade de renderização simultânea em múltiplos buffers de renderização, existente nas GPUs atuais, é utilizada caso um único buffer de renderização não possua bits por pixel suficientes para armazenar todos os atributos.

6. Decodificação de atributos. Neste estágio, realizado na CPU e chamado no fim do laço de renderização, a arquitetura transfere o conteúdo dos buffers de renderização para a memória do

sistema e decodifica os atributos contidos em cada pixel. Esses atributos são então retornados à aplicação. Ao contrário dos estágios anteriores, que devem ser executadas uma vez para cada modelo geométrico sob interação, esse procedimento só precisa ser executado uma vez em cada iteração do laço de renderização.

Auxiliada pelo sistema de janelas, os atributos decodificados podem ser utilizados pela apli- cação para concluir a tarefa de interação e fornecer alguma realimentação ao sistema, em geral um retorno visual (e.g., atualizando a posição e orientação do cursor 3D). As ações de manipu- lação, definidas pela aplicação, também podem resultar em modificações da geometria original (e.g., mudança da posição dos vértices ou faces), modificações da conectividade da geometria (e.g., em uma operação de recorte e costura de superfícies), modificações do conteúdo das tex- turas utilizadas pelo modelo (e.g., decorrentes de uma tarefa de pintura 3D) ou modificações dos parâmetros das funções de deformação. Em tais casos, a aplicação é responsável por infor- mar essas mudanças à arquitetura de interação de acordo com a interface de entrada descrita na seção 5.4.2.