|
|
7. Silicon Graphics Inc. OpenGL versus Microsoft Direct3D |
Ambos, o OpenGL e o Direct3D, mostram um
tradicional pipeline para a renderização gráfica. A arquitectura do pipeline tem
estado presente desde muito cedo na computação gráfica e tem sido melhorada e
aumentada ao longo dos anos, com o aumento das capacidades do hardware, contudo
o paradigma fundamental não se alterou.
Uma comparação entre estes dois API’s, não é algo fácil e
objectivo. Tentamos aqui mostrar, principalmente as diferenças para que seja
possível ao leitor escolher.
Um dos aspectos muito citados na comparação destas duas interfaces
é, como não podia deixar de ser, o desempenho. Este não é, no entanto, um
aspecto importante. O desempenho de ambos os API’s é praticamente idêntico para
programas bem escritos, independentemente da interface. A performance apenas
pode ser medida em função da máquina. No caso de programação de jogos, se um
jogo está bem escrito, por programadores com um conhecimento profundo do API, o
desempenho fica por conta dos fabricantes das placas gráficas e dos drivers. O
que determina a performance, é a forma como API, driver, sistema operativo e
hardware interagem [7].
O mesmo se aplica quando falamos de qualidade. O factor mais
importante na qualidade é a capacidade do artista. O bom artista pode fazer um
mau jogo parecer fantástico, mas o inverso também se aplica.
A capacidade de renderização por software é outra das falsas
questões. A renderização por software adiciona funcionalidades que o hardware
não implementa. Como se pode imaginar, estas funcionalidades têm de ser escritas
pelo programador, o que adiciona um enorme overhead ao programa. Como a
renderização corre juntamente com o programa, o desempenho é muito penalizado.
Adicionando o facto de que, escrever um bom software de renderização, é uma
tarefa extremamente difícil. Embora haja algumas vantagens na renderização por
software, elas são muito poucas [8].
A batalha num ambiente Windows entre Direct3D e OpenGL é grande. Se
pretender escrever programas para plataformas que não o Windows, então a escolha
é simples, uma vez que o Direct3D não corre nessas plataformas. Se pretende
escrever programas para Windows, então a decisão é difícil. Os API’s são
semelhantes por isso, se conhecer um, facilmente aprender o outro, já que os
conceitos fundamentais são os mesmos. Se não tem uma preferência, então procure
uma moeda. Não interessa o tipo ou valor, basta que tenha dois lados diferentes.
Escolha um para ser “cara” e o outro “coroa”. Atire a moeda ao ar e se for
“cara” escolha o OpenGL, se for “coroa” opte por Direct3D. No entanto, seja qual
for o API que escolha mantenha-se fiel. A programação gráfica não é fácil de
aprender. Não importa questionar-se se seria melhor o outro, porque no fim,
verdadeiramente, não interessa.
Para ajudar numa eventual escolha, baseada em métodos menos
aleatórios segue-se a tabela 2, que não pretende ser exaustiva, das
características de cada um dos API’s:
| Funcionalidade | OpenGL 1.2 Core | Direct3D 7 | Direct3D 8 |
| System Mechanics | |||
| Operating System Support | Windows (9x, NT, 2000), MacOS, BeOS, *nix, others | Windows (9x, 2000, CE) | Windows (9x, 2000) |
| API Definition Control | OpenGL ARB | Microsoft | Microsoft |
| API Specification | OpenGL Specification | SDK/DDK Documentation and DDK Reference | SDK Documentation |
| API Mechanism | includes and libraries | COM | COM |
| Software Emulation of Unaccelerated Features | Sim | Não | Não |
| Extension Mechanism | Sim | Não | Sim |
| Source Implementation Available | Sim | Sim | Não |
| Modeling | |||
| Fixed-Function Vertex Blending | Não | Sim | Sim |
| Programmable Vertex Blending | Não | Não | Sim |
| Parametric Curve Primitives | Sim | Não | Sim |
| Parametric Surface Primitives | Sim | Não | Sim |
| Hierarchical Display Lists | Sim | Não | Não |
| Rendering | |||
| Two-sided Lighting | Sim | Não | Não |
| Point Size Rendering Attributes | Sim | Não | Sim |
| Line Width Rendering Attributes | Sim | Não | Não |
| Programmable Pixel Shading | Não | Não | Sim |
| Triadic Texture Blending Operations | Não | Não | Sim |
| Cube Environment Mapping | Não | Sim | Sim |
| Volume Textures | Sim | Não | Sim |
| Multitexture Cascade | Não | Sim | Sim |
| Texture Temporary Result Register | Não | Não | Sim |
| Mirror Texture Addressing | Não | Sim | Sim |
| Texture "Wrapping" | Não | Sim | Sim |
| Range-Based Fog | Não | Sim | Sim |
| Bump Mapping | Não | Sim | Sim |
| Modulate 2X Texture Blend | Não | Sim | Sim |
| Modulate 4X Texture Blend | Não | Sim | Sim |
| Add Signed Texture Blend | Não | Sim | Sim |
| Frame Buffer | |||
| Hardware Independent Z Buffer Access | Sim | Não | Não |
| Full-Screen Antialiasing | Sim | Sim | Sim |
| Motion Blur | Sim | Não | Sim |
| Depth of Field | Sim | Não | Sim |
| Accumulation Buffers | Sim | Não | Não |
| Miscellaneous | |||
| Picking Support | Sim | Não | Não |
| Multiple Monitor Support | Não | Sim | Sim |
| Stereo Rendering | Sim | Sim | Não |
Tabela 2 – Diferenças entre OpenGL e Direct3D [9].