Yocto/GL é uma coleção de pequenas bibliotecas C++17 para construção de algoritmos gráficos baseados em física, lançada sob a licença do MIT. Yocto/GL é escrito em um estilo deliberadamente orientado a dados para facilidade de desenvolvimento e uso. Yocto/GL é dividido em pequenas bibliotecas para facilitar a navegação do código. Consulte cada arquivo de cabeçalho para obter documentação.
yocto/yocto_math.{h}
: vetores de tamanho fixo, matrizes, quadros rígidos, transformaçõesyocto/yocto_color.{h}
: conversão de cores, ajuste de cores, funções de mapeamento de tons, gradação de cores, mapas de cores, espaços de coresyocto/yocto_geometry.{h}
: raios, caixas delimitadoras, funções geométricas, intersecção primitiva de raio, sobreposição primitiva de pontoyocto/yocto_noise.{h}
: Ruído Perlinyocto/yocto_sampling.{h}
: geração de números aleatórios, geração de pontos e direções, utilidades de Monte Carloyocto/yocto_shading.{h}
: avaliação e amostragem de funções de fresnel, lóbulos bsdf, lóbulos de transmitância, funções de faseyocto/yocto_image.{h,cpp}
: tipo de dados de imagem simples, redimensionamento de imagem, mapeamento de tons, correção de cores, imagens procedurais, céu-sol processualyocto/yocto_shape.{h,cpp}
: estrutura de dados de forma simples, utilitários para manipulação de malhas triangulares, malhas quádruplas e conjuntos de linhas, cálculo de normais e tangentes, subdivisão linear e Catmull-Clark, geração de formas procedurais, interseção de raios e consultas de pontos mais próximosyocto/yocto_scene.{h,cpp}
: representação de cena e avaliação de propriedadesyocto/yocto_bvh.{h,cpp}
: interseção de raios e consultas de pontos mais próximos de malhas triangulares, malhas quadrantes, conjuntos de linhas e cenas de instâncias usando uma hierarquia de volume delimitador de dois níveisyocto/yocto_trace.{h,cpp}
: rastreamento de caminho de superfícies e fios de cabelo que suportam iluminação de área e ambiente, microfaceta GGX e espalhamento de subsuperfície, amostragem de importância múltiplayocto/yocto_sceneio.{h,cpp}
: serialização de imagem, forma e cenayocto/yocto_modelio.{h,cpp}
: análise e escrita de baixo nível para formatos Ply, Obj, Stlyocto/yocto_pbrtio.{h,cpp}
: análise e escrita de baixo nível para formato Pbrtyocto/yocto_cli.{h}
: utilitários de impressão e análise de linha de comandoyocto/yocto_parallel.h
: utilitários de simultaneidade (obsoleto)Você pode ver o Yocto/GL em ação nos seguintes aplicativos escritos para testar a biblioteca:
apps/ytonemap.cpp
: conversão e visualização de imagensapps/ycolorgrade.cpp
: classificação de cores da imagemapps/yconvert.cpp
: conversão de cenaapps/yconverts.cpp
: conversão de formaapps/ytrace.cpp
: renderização de cena offline e interativaapps/ycutrace.cpp
: renderização de cena offline e interativa com CUDAapps/yview.cpp
: visualização de cena interativaAqui estão algumas imagens de teste renderizadas com o path tracer. Mais imagens estão incluídas no site do projeto.
Yocto/GL segue um "modelo de programação orientado a dados" que torna os dados explícitos. Os dados são armazenados em estruturas simples e acessados com funções gratuitas ou diretamente. Todos os dados são públicos, portanto não fazemos nenhuma tentativa de encapsulamento. Fazemos isso porque torna o Yocto/GL mais fácil de estender e mais rápido de aprender, com um fluxo de dados mais explícito que é mais fácil ao escrever código paralelo. Como o Yocto/GL é usado principalmente para pesquisa e ensino, os dados explícitos são mais hackeáveis e mais fáceis de entender.
Quase todos os objetos no Yocto/GL possuem valor semântico. Isso significa que tudo pode ser copiado e serializado de maneira trivial e não há necessidade de gerenciamento de memória. Embora isso tenha a desvantagem de potencialmente introduzir cópias falsas, tem o benefício de garantir que nenhuma corrupção de memória possa ocorrer, o que acabou sendo um grande problema para usuários iniciantes de C++, mesmo em uma biblioteca muito pequena como esta.
Em termos de estilo de código preferimos uma abordagem funcional em vez de uma abordagem orientada a objetos, favorecendo funções livres em vez de métodos de classe. Todas as funções e dados são definidos no namespace yocto
para que as bibliotecas possam chamar umas às outras de maneira trivial.
O uso de templates no Yocto foi o motivo de muitas refatorações, passando de nenhum template para o uso pesado de templates. Neste ponto, Yocto usa alguns modelos para facilitar a leitura. No futuro, aumentaremos o uso de modelos em código matemático, mantendo muitas APIs digitadas explicitamente.
Para tratamento de erros em IO, retornamos o objeto de status ou uma interface que usa sinalizadores booleanos e strings de erro. Exceções internas são usadas quando usadas por bibliotecas externas, mas caso contrário, nenhuma exceção é usada. No momento, as exceções são usadas apenas para relatar "erros do programador", ou seja, quando pré-condições ou pós-condições são violadas em funções, assim como a biblioteca padrão faz.
A biblioteca é lançada sob a licença do MIT. Incluímos na distribuição diversas dependências externas, cada uma com licença própria, compatível com a escolhida.
Esta biblioteca requer um compilador C++ 17 e é compilada em OsX (Xcode >= 11), Windows (MSVC >= 2019) e Linux (gcc >= 9, clang >= 9).
Você pode construir os aplicativos de exemplo usando CMake com mkdir build; cd build; cmake ..; cmake --build .
As dependências necessárias do Yocto/GL estão incluídas na distribuição e não precisam ser instaladas separadamente.
Yocto/GL suporta opcionalmente a construção de demonstrações OpenGL. O suporte OpenGL é habilitado definindo a opção cmake YOCTO_OPENGL
. As dependências do OpenGL estão incluídas neste repositório.
Yocto/GL suporta opcionalmente o uso do Embree da Intel para fundição de raios. Veja o arquivo principal do CMake para saber como vincular a ele. O suporte Embree é habilitado definindo a opção cmake YOCTO_EMBREE
. O Embree precisa ser instalado separadamente.
Yocto/GL suporta opcionalmente o uso do Open Image Denoise da Intel para remoção de ruído. Veja o arquivo principal do CMake para saber como vincular a ele. O suporte Open Image Denoise é habilitado definindo a opção cmake YOCTO_DENOISE
. OIDN precisa ser instalado separadamente.