|
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].