Eu desenvolvo meu jogo na maioria das vezes no ArchLinux. Decidi experimentá-lo no Ubuntu 16.04 recentemente. A situação que me deparei era realmente estranha:

  1. Nenhum glGetError() s.
  2. Sem erros, avisos, nada de ruim na saída gl debug.
  3. Todas as afirmações que eu fiz para todas as situações ruins não foram acionadas.
  4. glClear limpou os buffers com sucesso I especificado, mas:
  5. glDraw* não desenhou nada.

Felizmente, encontrei uma solução que deveria definir glViewport . No entanto, não entendo muito bem, por que é necessário desenhar no Ubuntu mas não no ArchLinux? A diferença também é entre os adaptadores gráficos: no archlinux eu uso NVIDIA 1060, no Ubuntu eu uso HD Graphics P530 integrado (Skylake GT 2 ).

Se for importante, eu uso SDL2 com opengl 4.4.

Comentários

  • It ' é importante que você perceba que o sistema operacional não é relevante aqui; o OpenGL é implementado por seu fornecedor de GPU em seus drivers, portanto, os fatores importantes são suas GPUs e seus drivers. Onde o sistema operacional pode ser interessante é se o seu fornecedor de GPU tem bases de código diferentes para sistemas operacionais diferentes, mas caso contrário, ' não é uma informação útil.
  • @MaximusMinimus esta pode ser a resposta à pergunta.

Resposta

Você já tem duas boas respostas, mas podem ser difíceis de entender para um iniciante, então eu “vou lhe dizer por que realmente precisamos do função.

Na renderização típica pode parecer sem sentido – você apenas cria alguma janela ou alvo de renderização e desenha nela, certo? Eu diria que mais de 95% dos aplicativos funcionam dessa forma.

Mas digamos que você está escrevendo um aplicativo como o 3DS MAX, em que sua janela é dividida em 4 renderizações distintas. Você se lembra do seu posição de divisão atual e você gerencia eventos de mouse, então quando você passa o mouse sobre a barra de divisão, você pode alterar o cursor do mouse para redimensionar um, etc. Quando você arrasta sua barra de divisão, você se lembra de sua nova posição e assim por diante.

Quando você deseja renderizar suas visualizações 3D, você chama glViewport com a posição e tamanho de sua primeira subjanela 3D e executa comandos GL típicos para desenhar aqui. O OpenGL dimensionará automaticamente a renderização para que se ajuste à janela de visualização fornecida. Você faz o mesmo para o restante de suas janelas de visualização e no final você obtém uma janela com algumas renderizações diferentes, cada uma com seus próprios parâmetros. Dessa forma, você pode ter quantas renderizações distintas em uma única janela / destino de renderização desejar.

Por que não funcionou em uma máquina?

GPUs e seus drivers têm muitos detalhes de implementação e diferenças, portanto, em geral, você precisa se acostumar com essas questões. Um exemplo simples: no shader GLSL, você pode criar um vetor zero 2D como este: vec2(0.0,0.0), você também pode tentar escrever um valor: vec2(0.0) e com este código alguns drivers irão tratá-lo como uma versão anterior, enquanto outros irão retornar um erro e não renderizar nada. Tenha em mente que os drivers de dois fornecedores serão mais diferentes do que duas versões do mesmo driver, por isso é uma boa ideia testar seu código em GPUs nVidia, ATI e Intel. Neste caso, suspeito que nos drivers da nVidia, quando você não defina o vieport sozinho, eles presumem que você deseja usar o destino de renderização inteiro, enquanto os drivers da Intel não fazem isso.

Resposta

glViewport permite ao opengl saber como mapear as coordenadas NDC para as coordenadas do framebuffer.

Por padrão, ele é definido para o tamanho total do buffer da tela. Portanto, você só precisa chamá-lo quando a janela seja redimensionado ou você realmente deseja alterá-lo.

Comentários

  • Ou ao renderizar para um framebuffer, assumindo que o tamanho da janela seja diferente.

Resposta

glViewport especifica a transformação afim de xx e yy de coordenadas de dispositivo normalizadas para coordenadas de janela. Let (xnd , ynd) xndynd be normalized device coord inatos. Em seguida, as coordenadas da janela (xw, yw) xwyw são calculadas da seguinte forma:

  • “xw = (xnd + 1) (largura2) + xxw = xnd + 1⁢width2 + x”
  • “yw = (ynd + 1) (height2) + yyw = ynd + 1⁢height2 + y”

A largura e a altura da janela de visualização são silenciosamente fixadas a um intervalo que depende de a implementação. Para consultar esse intervalo, chame glGet com o argumento “GL_MAX_VIEWPORT_DIMS”

Os parâmetros x e y especificam o canto inferior esquerdo da janela de visualização em pixels, enquanto largura e altura especificam a largura e altura da janela de visualização

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *