Por que todas as chamadas de função do OpenGL são prefixadas com "q" no código-fonte do Doom 3?

42

Por que toda chamada OpenGL é prefixada com um "q" no código-fonte do Doom 3? São funções personalizadas ou uma biblioteca diferente e, se sim, por que usá-lo no OpenGL? Qualquer pesquisa no Google vem com o módulo Qt OpenGL, que suponho não ter nada a ver com isso.

Ben
fonte

Respostas:

62

Para referência - qgl.h de Doom3 .

OpenGL é uma API pouco estranha. Muitas vezes, você deve trabalhar com ponteiros de função porque faltam novas funcionalidades na implementação padrão ou porque você deseja trabalhar com extensões. Por exemplo, se você deseja ligar glCreateShader, mas o sistema operacional em que você está desenvolvendo não é fornecido com novos cabeçalhos GL suficientes, você deve usar glGetProcAddress("CreateShader")para carregar a função no driver do usuário. E então você tem que armazenar esse ponteiro de função em algum lugar.

Mesmo que seu ambiente de desenvolvimento tenha uma função específica, as máquinas dos usuários podem não ter. E então, uma determinada função pode vir de 2 a 3 formulários (extensão de fornecedor, extensão ARB, função principal) e, portanto, talvez você precise procurar uma função com vários nomes diferentes.

Muitas bibliotecas GL "loader" (como GLEW ) tentam seguir as convenções GL. Eles criam funções "falsas" com o glprefixo- usual e tentam magicamente fazer com que seu código funcione em qualquer sistema operacional ou driver que ofereça suporte aos recursos necessários. Essencialmente, em vez de glFooser uma função real, é apenas um ponteiro global função ea biblioteca loader (durante a inicialização ou a primeira utilização) pesquisas FooEXT, FooARBe Fooaté encontrar uma implementação e atribui isso ao ponteiro global. O código do cliente parece que está apenas chamando uma função regular, mas magicamente tudo é resolvido no tempo de execução durante a inicialização, de uma maneira que lida com todas as diferentes plataformas e drivers existentes.

Outras bibliotecas colocam as funções em espaços para nome ou, de outra forma, variam um pouco da norma GL. id escreveu seu próprio carregador, seja porque não fez como os que existiram ou - mais provável - Quake apenas antecede qualquer outra biblioteca que id poderia ter usado (o qna qglarquibancada prováveis para Quake, que foi o primeiro jogo id Tech para uso GL).

A especificação GL é gravada com essa possibilidade. A especificação é escrita sem prefixos; é a implementação do OpenGL que decide em qual prefixo usar ( glsendo o comum, é claro). As bibliotecas do carregador que colocam as funções em espaços para nome ou usam seus próprios prefixos são completamente válidas.

O Doom 3, baseado no mecanismo Quake, é completamente típico e justificado ao usar uma biblioteca de carregadores para lidar com as esquisitices do GL em várias plataformas e na escolha de usar o qglprefixo.

Sean Middleditch
fonte
+1 e parabéns por detectar que escrevi idmal (você está completamente certo sobre a capitalização), embora o site en.wikipedia.org/wiki/Id_Tech ainda esteja escrito com espaço, em todas as fontes que pude encontrar.
precisa saber é o seguinte