Posted by: mitus | January 13, 2009

Placas de Video

Atualmente as placas de video tornaram-se componentes fundamentais nos computadores. Antes exclusivas das aplicações gráficas, elas estão nas listas de requisitos de sistemas operacionais como o Vista e gnu/linux com suporte ao desktop 3D. Mas como funciona uma placa de vídeo? Quais suas partes?

Neste post vou tentar transcrever um antigo post de um sitio que não me recordo mais. Então fica registrado que o texto abaixo é baseado na lembrança de um post de outro local que tentarei localizar mais tarde.

O Papel da Placa de Vídeo

Para o 3D em tempo real a renderização de cenas é a parte mais importante, este processo deve ocorrer com o máximo de credibilidade possível. Esta credibilidade é associada, atualmente, com a realidade e a fluidez da cena renderizada. A realidade está associada as texturas e técnicas de iluminação utilizadas, e a fluidez à quantidade de frames por segundo (FPS) em que a cena é exibida.

Para alcançar maior credibilidade, programadores são obrigados a escreverem códigos cada vez mais complexos, e com maior necessidade de processamento, para que estes efeitos sejam cada vez melhores e com o mínimo de perda no desempenho.

Antigamente este processamento gráfico era feito pelas CPUs. Nos anos 90 a Nvidia, então conhecida pelos chipsets RIVA, mudou a forma como as coisas funcionavam e introduziu sua placa GeForce 256 no mercado. A mudança trazida pela nVidia foi a retirada dos cálculos gráficos da CPU e transportada para outra central de processamento, a GPU (Graphics Processing Unit, Unidade de Processamento Gráfico). Pouco tempo depois a ATI, empresa concorrente da Nvidia, lançou suas placas com o conceito de VPU (Visual Processing Unit, Unidade de Processamento Visual). O acrônimo sobrevivente foi o GPU da nVidia.

A novidade trazida pela GeForce 256 foi a T&L, ou Transform & Ilumination (módulo de Transformação e Iluminação). A T&L é uma pequena unidade de cálculo, seu único papel é assumir a carga de cálculos necessários para a transformação dos vertices e a iluminação aplicada aos mesmos. Os cálculos realizados pela T&L são vetoriais e de bitmap. A idéia, portanto, foi transferir os cálculos para uma placa especializada, a de video.

Os Shaders Programáveis

No início, as funções T&L e os módulos de texturização eram implementados e gravados em chips de silício e acoplados ao hardware, tudo de forma definitiva. Rapidamente os desenvolvedores notaram que apesar das diferentes texturas utilizadas nos jogos, o contexto gráfico geral das cenas continuava igual. Isto acontecia porque as técnicas de renderização e texturas eram sempre as mesmas, as que acompanhavam as placas. Os resultados gráficos obtidos começavam a desagradar os desenvolvedores, porque impedia a diferenciação gráficas dos jogos, otimizações e personalização nos jogos(dentro do contexto das operações realizadas pelas placas) comprometendo a credibilidade das cenas e identidade dos jogos.

Para resolver este problema, foi dada a possibilidade de se programar as funções que antes eram imutáveis. Esta solução permitiu que os desenvolvedores 3D (principalmente os programadores de engines 3D) alterassem um conjunto de partes do pipeline 3D. Claro que reprogramar a T&L e o módulo de texturas não é uma tarefa tão fácil, mas os resultados obtidos foram recompensadores.

A reprogramação destas funções introduziu dois novos nomes no mundo 3D: o vertex shader, e o pixel shader. O papel do vertex shader é ser um caminho mais curto para o módulo T&L e o pixel shader para o módulo de texturização. Hoje em dia se fala muito sobre programação de shaders, tornando-se uma verdadeira febre.

Mas nem tudo eram flores. No início, a programação de pixel e vertex shaders era feita no assembler usado pelas GPUs (como a ARB da openGL ) e com o passar do tempo, e evolução, os algoritmos começaram a ficar complexos e de difícil manutenção. Para resolver este problema foi introduzida linhagens de alto nível como a HLSL(High Level Shading Language) para DirectX e GLSL para OpenGL.

Para entender a diferença entre programar no assembler da GPU e em uma linguagem de alto nível, veja o exemplo de um código para normalizar um vetor H.

Assembler:

DP3 result.w, vector, vector;
RSQ result.w, result.w;
MUL result.xyz, result.w, vector;

HLSL ou GLSL:
normalize(result);

Os Drivers

A guerra das empresas de vídeo pela hegemonia do mercado não está limitado ao hardware. O software produzido por estas empresas também ganhou atenção especial dos usuários.

Os drivers são softwares produzidos e distribuídos junto com as placas de vídeo. Eles permitem que aplicações utilizem os recursos destas placas. Apesar de toda placa possuir funcionalidades básicas, e todo sistema operacional conhecer estas funcionalidades, para um maior proveito é necessário drivers específicos.

Apesar dos benefícios de se utilizar os drivers, podemos ficar limitados a necessidade da placa X ou Y que implementa a funcionalidade que desejamos usar. Mas como utilizar as funcionalidades das placas por meio dos drivers?

Nós utilizamos através de dois padrões mundialmente conhecidos e utilizados, o OpenGL e o Direct3D. Atualmente todas as placas de video, e seus drivers, tem suporte à estes dois padrões. Então, quando executamos em nossa aplicação rotinas do OpenGL ou Direct3D estamos apenas passando informações para o driver poder se comunicar com a placa de video.

OpenGL e Direct3D

Uma vez os drivers instalados, o programador de aplicações 3D pode finalmente controlar a GPU e fazer a manipulação dos pixels na tela. A o fazê-lo, nos usamos dois padrões oferecidos que torna a programação a mesma, indiferente de placa: OpenGL e Direct3D.

Estes dois padrões são implementados nos drivers gráficos pelos criadores das placas (nVidia e ATI, por exemplo).

O OpenGL foi a primeira API criada com este propósito, desenvolvida pela Silicon Graphics no inicio dos anos 90: IrisGL. Esta API se tornou popular graças a atitude dos desenvolvedores da SGI que resolveram torná-la um padrão aberto. Usada em diversos sistemas operacionais e tipos de hardware (suportada em ambientes linux, windows, macos e outros).

No final dos anos 90, a Microsoft viu-se obrigada a reagir de forma a atrair o maior número de desenvolvedores de jogos para sua plataforma Windows. O principal problema era que o openGL estava funcional e sendo utilizada, mas o Windows estava longe de suportar programação gráfica operacional, nesta época o openGL era utilizado em maior escala na indústria.

Com o objetivo de inverter esta situação a microsoft desenvolveu o DirectX , um conjunto de APIs que permitiam a manipulação multimídia na sua plataforma. Por este motivo o DirectX está presente apenas em plataformas da microsoft( Windows, XBOX e outras).

Opengl e direct3d estão sendo desenvolvidas e evoluem a cada nova versão. Os 2 padrões propostos praticamente possuem as mesmas funcionalidades par a manipulação das placas 3D e são amplamente aceitos pelas placas gráficas do mercado. Atualmente o openGL está na sua versão 3.0 e o direct3D na versão 10.

Mas não vamos esquecer que os drivers servem apenas para tornar as funcionalidades das placas gráficas acessíveis de forma padronizada. Isto significa que se a placa não tiver estas funções (por exemplo, tolerância a vertex e pixel shader) o driver não poderá fazer nada. Portanto, dependendo da aplicação que você deseje usar a escolha da placa 3D e ter os drivers atualizados pode fazer a diferença.

No próximo post vamos continuar falando das placas de vídeo e suas funcionalidades e componentes. Até a próxima.


Leave a response

Your response:

Categories