As diferenças entre essas duas APIs são pequenos detalhes de implementação que significam que, depois de aprender uma, posso usá-la para tudo? Ou existem razões para aprender um ao invés do outro se eu quiser usá-lo em geral sem precisar reaprender outra API no futuro? Um ou outro é mais geral?
Em particular, eu gostaria de poder escrever para qualquer placa gráfica, para que o código não se restrinja apenas à execução nas placas de um fabricante específico ou em um modelo específico. Eu também gostaria de poder escrever um código que ainda funcione na ausência de uma placa gráfica (embora mais lenta).
Existe uma diferença em como o código portátil será em diferentes plataformas (sistemas operacionais / arquiteturas)? Estou interessado na disponibilidade de outras bibliotecas que trabalham com elas e se uma ou outra leva a menos restrições de licenciamento em seu ambiente mais amplo. Qualquer coisa mensurável que faça diferença se um deles pode ser o único que eu aprendo sem me restringir.
Respostas:
Eu não acho que isso importe muito, qual API você deseja usar ao inclinar-se para "programar gráficos". O mais importante a aprender são os conceitos típicos que você usa ao trabalhar com cenas em 3D. Por exemplo, você deseja aprender a escrever um gráfico de cena simples (e mais sofisticado). Esses conceitos são muito mais importantes que os nomes de métodos de API específicos que você precisa chamar.
Compare-o ao aprender a escrever programas. Se você é muito bom em escrever programas em, por exemplo, Java, não terá problemas em aprender C ++, Objective-C, Swift ou alguma outra linguagem orientada a objetos. Porque são os conceitos e o pensamento que você aprende.
A escolha entre OpenGL, Direct3D e Metal é principalmente a escolha, qual sistema operacional você deseja. O Direct3D está disponível principalmente no Windows, Metal no OS X e iOS, e o OpenGL é suportado na maioria dos sistemas, incluindo OS X, iOS, Windows e Linux.
A placa de vídeo provavelmente tem pouca ou nenhuma influência nessa decisão, pois não conheço uma placa que suporte apenas uma ou duas. Se você não possui uma placa gráfica dedicada, a renderização em tempo real será um problema em breve. Embora um Intel HD Graphics e o companheiro AMD já possam fazer bastante.
Então, escolha sua plataforma.
Isenção de responsabilidade: A partir de agora, eu não usava o Direct3D nem o Metal.
fonte
Atualmente, estamos em uma transição de paradigmas de API.
O método old school de vincular buffers, uniformes, atributos, layout e programas como estado global (implícito) e envio de empates com esse estado é comum no D3D11 e no OpenGL. No entanto, ele possui uma grande quantidade de sobrecarga (na verificação do estado e sem saber o que o programa deseja fazer até o último minuto). Eles também não são seguros para threads (na maior parte).
É por isso que novas APIs surgiram (ou estão chegando em breve) D3D12, vulkan e Metal sendo os mais proeminentes. Essas APIs dão mais controle ao programa e permitem que ele declare antecipadamente o que deseja fazer usando buffers de comando. Eles também permitem gerenciar seus próprios recursos (dados de vértices, texturas ...) muito mais diretamente. Usá-los com múltiplos é muito mais direto.
A escolha entre o antigo e o novo baseia-se em como você pode gerenciar a memória de vídeo alocada e criar o buffer de comando.
Se você deseja algo que "simplesmente funcione", mesmo em hardware mais antigo, as APIs da velha escola são melhores; eles também são mais conhecidos e você receberá mais ajuda on-line.
Por outro lado, se você pode lidar com a natureza assíncrona dos comandos de despacho e não se importa em rastrear todos os buffers que você aloca. Em seguida, as novas APIs podem ser algo para você.
fonte
Pessoalmente, não acho que isso importe muito. Basta escolher um que se adapte ao seu projeto. Eu usei o D3D e o OpenGL no passado. São os conceitos que importam. O que você escolher, você precisa entender (por exemplo):
Como outros mencionados aqui, estamos no meio de uma transição para um novo conjunto de APIs (Vulkan, Metal etc.). Nesse ponto, se você é completamente novo no Desenvolvimento de Gráficos, provavelmente o foco no GLSL é uma boa ideia, pois o Vulkan vai tirar proveito disso também.
Em relação à portabilidade, o D3D é apenas para Windows (existem rumores de que o projeto Wine está tentando fazer o D3D funcionar no Linux, mas nada é possível até agora). O OpenGL é multiplataforma. Se você deseja se conectar, o OpenGL ES é uma opção disponível. É claro que o OpenGL e o OpenGL ES têm versões diferentes que não são suportadas por todas as plataformas.
No final do dia, todas as APIs acessam o mesmo hardware em sua máquina, é apenas uma questão de "como" elas acessam.
fonte
Vou dizer algumas palavras sobre a renderização sem placas gráficas.
O OpenGL ou o DirectX precisam realmente de uma placa de vídeo. Uma implementação pode ser totalmente acelerada por software.
Para o OpenGL no Linux, existe o rasterizador do software Mesa. Na minha experiência, ele funciona bem, desde que você não force demais a combinação de recursos estranhos (lista de exibição + matrizes de vértices indexadas). Eu imagino que a lista deles de bugs reais é muito alta. Certifique-se de fazer testes contínuos!
Tenho menos experiência com o OpenGL no Windows. Edite a resposta se você souber alguma coisa!
O DirectX SDK é entregue com um rasterizador de software chamado "rasterizador de referência". É principalmente para depuração, na minha opinião, mas conheço pelo menos um amigo usando o rasterizador de referência ao desenvolver o DX11 em um laptop com capacidade apenas para o DX10. Conforme mencionado em outras respostas, o DirectX é apenas da Microsoft.
fonte