Importa se eu aprendo OpenGL ou Direct3D?

11

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.

Trichoplax
fonte
2
a resposta da catraca aberração é boa. Se você quiser aprender Direct3D, pode ler meu livro gratuito "The Direct3D Graphics Pipeline" . Os detalhes da API são principalmente o Direct3D9, mas os conceitos são os mesmos. O fato é que os conceitos para programação de gráficos 3D realmente não mudaram desde o final dos anos 1960. As APIs para expressar esses conceitos ficaram muito mais inteligentes.
legalize

Respostas:

9

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.

Nero
fonte
2
> "Se você é muito bom em escrever programas em, por exemplo, Java, não terá muito problema em aprender C ++" - isso não é verdade. Todo mundo terá uma quantidade colossal de problemas para aprender e usar C ++. Compará-lo com Java ou qualquer outra linguagem segura é completamente inapropriado. Para outros idiomas que você listou (Objective-C, Swift ou alguma outra linguagem orientada a objetos), essa afirmação é principalmente verdadeira.
Exibir nome
9

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

catraca arrepiante
fonte
6
As novas APIs gráficas explícitas não são realmente projetadas para consumo pelo programador gráfico médio, são mais para as pessoas que trabalham com infraestrutura em mecanismos ou para aqueles que realmente precisam do desempenho. Eles oferecem uma arma muito maior e apontam para o seu pé.
porglezomp
3

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):

  • O que são texturas e como são usadas pela GPU.
  • Conceitos básicos de desenvolvimento de gráficos (vértices, primitivos, fragmentos etc.)
  • Como o sistema da câmera funciona (matrizes MVP no OpenGL, por exemplo).
  • O que são shaders e como usá-los corretamente.
  • Quão diferente uma GPU funciona em relação à CPU em sua máquina.
  • Quais são as diferenças entre o modelo de memória da GPU e o modelo de memória da CPU.
  • O que deve ser feito na CPU e o que deve ser transferido para a GPU para processamento.

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.

Sepehr
fonte
O Direct3D também é o que você usaria se estivesse programando para qualquer um dos consoles do Xbox.
legalize
O que você quer dizer com "nada viável"? O Wine executa centenas de programas baseados em D3D sem problemas e o faz há anos. É claro que existem bugs e partes não implementadas, mas isso não torna a API inteira inutilizável.
Ruslan
0

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.

Andreas
fonte
Na minha experiência, o uso de uma placa de vídeo integrada deve ser bom o suficiente para a maioria dos desenvolvimentos do OpenGL no Windows, mas verifique se ele suporta uma versão recente do OpenGL.
Akaltar