Como você testaria em unidade ou executaria o teste automatizado mais eficaz em código gráfico para o OpenGL?

17

Estou escrevendo um jogo e o mecanismo gráfico que acompanha o OpenGL em C ++. Também sou fã de bons processos de codificação e testes automatizados. O código gráfico + o teste parecem bastante imiscíveis, pois a saída geralmente é apenas visual ou muito orientada para o visual.

Por exemplo, imagine analisar o fluxo de imagem bruto processado na tela, byte a byte - você precisa comparar os dados de teste, o que é difícil de criar / obter, e geralmente as imagens renderizadas não são idênticas em um nível de bytes ao executar em momentos diferentes - pequenas alterações nos algoritmos prejudicarão completamente essa abordagem.

Estou pensando em criar uma suíte visual de teste de unidade, na qual eu possa renderizar diferentes cenas de teste, mostrando coisas como mapeamento de sombras, animação, etc etc etc. Como parte do CI, essas cenas serão renderizadas em um vídeo arquivo (ou possivelmente deixá-lo como um executável) com diferentes métricas. Isso ainda exigiria inspeção manual do arquivo de vídeo, mas, pelo menos, seria um pouco automatizado e padronizado.

O que você acha? Espero que haja maneiras melhores?

Máx.
fonte
2
Esta é uma boa pergunta, gostaria de saber se você obteria melhores respostas em gamedev.stackexchange.com, pois pode haver mais pessoas lá que já lidaram com isso antes.
FrustratedWithFormsDesigner
3
Como você usa o OpenGL, considere estudar a maneira como o grupo Khronos realiza testes de conformidade para esta API. Colegas do meu ex-projeto que lidou com ele me disse que os gráficos Khronos teste é tão perto da perfeição quanto ele ganha
mosquito
@FrustratedWithFormsDesigner Obrigado, esqueci completamente a gamedev.stackexchange ... procurei bastante em programadores, mas não naquele. Parece que a maioria das respostas nos testes de unidade ali se concentra nas coisas geralmente testadas, então talvez isso não seja uma duplicação. Irá verificar um pouco mais, porém, obrigado :)
Max

Respostas:

8

A biblioteca de processamento de imagem opencv faz isso salvando a imagem e comparando-a com uma imagem de referência - possui várias funções e macros de teste em c ++ para lidar com a correspondência aproximada de imagens, etc.

Martin Beckett
fonte
Vou tentar verificar mais detalhadamente, mas essa página não diz nada sobre a correspondência aproximada de imagens. Você sabe se funcionaria para testes de regressão no caso de comparar quadros? Então eu poderia inspecionar visualmente a primeira vez que uma cena é renderizada, anotá-la como uma referência etc. O OpenCV tem funções prontas para isso que eu poderia usar? : p
Max
@max geralmente existe uma versão 'gold' da função de teste que gera o quadro de referência e é executada uma vez ao criar o teste. Na distribuição, existem algumas macros "comparar imagem de teste". Eu não acho que exista algo específico para ler buffers openGL de volta para uma imagem, mas isso é fácil o suficiente #
Martin Beckett
4

Sua estrutura de teste pode renderizar sua imagem de teste em um buffer, recuperar a imagem renderizada e compará-la com uma imagem de referência "dourada" que foi gerada anteriormente para esse fim.

Isso não funcionará tão bem nos casos em que não se espera que os resultados do seu teste permaneçam exatamente os mesmos. No entanto, você pode calcular a diferença ao quadrado das imagens de teste e de referência e compará-la com um limite.

Você também pode fornecer dados de log e verificação de desempenho, pois uma grande regressão no desempenho é outro modo de falha possível.

tempestade
fonte
4

Mesmo que você não consiga comparar as imagens de saída, pelo menos você poderá testar se suas renderizações são concluídas adequadamente (sem falhas, longas esperas, etc.). Encontrar uma maneira de verificar as imagens é melhor, é claro, mas mesmo sem ela você terá ganho algo com os testes.

Michael Kohne
fonte
2
Exatamente: eu estava prestes a responder algo semelhante ("Mesmo se você tiver um teste de unidade que gere cegamente o arquivo de vídeo e faça alguns testes triviais (por exemplo, tenha o comprimento certo, não completamente preto, não completamente branco), pode ser o suficiente para capturar muitos erros de regressão. Especialmente aqueles que simplesmente fazem com que suas funções gerem uma exceção. ") mas não há necessidade de uma segunda resposta semelhante, por isso deixo como comentário aqui.
User281377