Yocto/GL es una colección de pequeñas bibliotecas C++17 para crear algoritmos gráficos basados físicamente publicados bajo la licencia MIT. Yocto/GL está escrito en un estilo deliberadamente orientado a datos para facilitar el desarrollo y el uso. Yocto/GL está dividido en pequeñas bibliotecas para facilitar la navegación del código. Consulte cada archivo de encabezado para obtener documentación.
yocto/yocto_math.{h}
: vectores de tamaño fijo, matrices, marcos rígidos, transformacionesyocto/yocto_color.{h}
: conversión de color, ajuste de color, funciones de mapeo de tonos, gradación de color, mapas de color, espacios de coloryocto/yocto_geometry.{h}
: rayos, cuadros delimitadores, funciones geométricas, intersección primitiva de rayos, superposición primitiva de puntosyocto/yocto_noise.{h}
: Ruido Perlinyocto/yocto_sampling.{h}
: generación de números aleatorios, generación de puntos y direcciones, utilidades Monte Carloyocto/yocto_shading.{h}
: evaluación y muestreo de funciones de Fresnel, lóbulos bsdf, lóbulos de transmitancia, funciones de faseyocto/yocto_image.{h,cpp}
: tipo de datos de imagen simple, cambio de tamaño de imagen, mapeo de tonos, corrección de color, imágenes de procedimiento, cielo solar de procedimientoyocto/yocto_shape.{h,cpp}
: estructura de datos de forma simple, utilidades para manipular mallas triangulares, mallas cuádruples y conjuntos de líneas, cálculo de normales y tangentes, subdivisión lineal y de Catmull-Clark, generación de formas procedimentales, intersección de rayos y consultas de puntos más cercanos.yocto/yocto_scene.{h,cpp}
: representación de escena y evaluación de propiedadesyocto/yocto_bvh.{h,cpp}
: intersección de rayos y consultas de puntos más cercanos de mallas triangulares, mallas cuádruples, conjuntos de líneas y escenas de instancias utilizando una jerarquía de volúmenes delimitadores de dos niveles.yocto/yocto_trace.{h,cpp}
: trazado de trayectoria de superficies y pelos que respaldan la iluminación del área y del entorno, microfacetas GGX y dispersión del subsuelo, muestreo de importancia múltipleyocto/yocto_sceneio.{h,cpp}
: serialización de imágenes, formas y escenasyocto/yocto_modelio.{h,cpp}
: análisis y escritura de bajo nivel para formatos Ply, Obj, Stlyocto/yocto_pbrtio.{h,cpp}
: análisis y escritura de bajo nivel para formato Pbrtyocto/yocto_cli.{h}
: utilidades de impresión y análisis de línea de comandoyocto/yocto_parallel.h
: utilidades de concurrencia (en desuso)Puede ver Yocto/GL en acción en las siguientes aplicaciones escritas para probar la biblioteca:
apps/ytonemap.cpp
: conversión y visualización de imágenesapps/ycolorgrade.cpp
: gradación de color de imagenapps/yconvert.cpp
: conversión de escenaapps/yconverts.cpp
: conversión de formaapps/ytrace.cpp
: representación de escenas interactiva y sin conexiónapps/ycutrace.cpp
: renderizado de escenas interactivas y sin conexión con CUDAapps/yview.cpp
: visualización interactiva de escenasAquí hay algunas imágenes de prueba renderizadas con el trazador de ruta. Se incluyen más imágenes en el sitio del proyecto.
Yocto/GL sigue un "modelo de programación orientado a datos" que hace que los datos sean explícitos. Los datos se almacenan en estructuras simples y se accede a ellos con funciones gratuitas o directamente. Todos los datos son públicos, por lo que no intentamos encapsularlos. Hacemos esto porque hace que Yocto/GL sea más fácil de extender y más rápido de aprender, con un flujo de datos más explícito que es más fácil al escribir código paralelo. Dado que Yocto/GL se utiliza principalmente para investigación y enseñanza, los datos explícitos son más fáciles de piratear y de entender.
Casi todos los objetos en Yocto/GL tienen valores semánticos. Esto significa que todo se puede copiar y serializar de forma trivial y no es necesario gestionar la memoria. Si bien esto tiene el inconveniente de introducir potencialmente copias espurias, tiene la ventaja de garantizar que no se produzcan daños en la memoria, lo que resultó ser un problema importante para los usuarios novatos de C++, incluso en una biblioteca muy pequeña como esta.
En términos de estilo de código, preferimos un enfoque funcional en lugar de uno orientado a objetos, favoreciendo las funciones libres a los métodos de clase. Todas las funciones y datos se definen en el espacio de nombres yocto
para que las bibliotecas puedan llamarse entre sí de forma trivial.
El uso de plantillas en Yocto fue el motivo de muchas refactorizaciones, pasando de no tener plantillas a utilizarlas en gran medida. En este punto, Yocto utiliza algunas plantillas para facilitar la lectura. En el futuro, aumentaremos el uso de plantillas en el código matemático, manteniendo al mismo tiempo muchas API escritas explícitamente.
Para el manejo de errores en IO devolvemos un objeto de estado o una interfaz que usa indicadores booleanos y cadenas de error. Se utilizan excepciones internas cuando las utilizan bibliotecas externas, pero por lo demás no se utiliza ninguna excepción. Por el momento, las excepciones sólo se utilizan para informar "errores de programador", es decir, cuando se violan condiciones previas o posteriores en funciones, tal como lo hace la biblioteca estándar.
La biblioteca se publica bajo la licencia MIT. Incluimos varias dependencias externas en la distribución que tienen cada una su propia licencia, compatible con la elegida.
Esta biblioteca requiere un compilador de C++17 y se sabe que se compila en OsX (Xcode >= 11), Windows (MSVC >= 2019) y Linux (gcc >= 9, clang >= 9).
Puede crear las aplicaciones de ejemplo utilizando CMake con mkdir build; cd build; cmake ..; cmake --build .
Las dependencias requeridas de Yocto/GL están incluidas en la distribución y no es necesario instalarlas por separado.
Yocto/GL admite opcionalmente la creación de demostraciones de OpenGL. La compatibilidad con OpenGL se habilita definiendo la opción cmake YOCTO_OPENGL
. Las dependencias de OpenGL están incluidas en este repositorio.
Yocto/GL admite opcionalmente el uso de Embree de Intel para la transmisión de rayos. Consulte el archivo principal de CMake para saber cómo vincularlo. La compatibilidad con Embree se habilita definiendo la opción cmake YOCTO_EMBREE
. Embree debe instalarse por separado.
Yocto/GL admite opcionalmente el uso de Open Image Denoise de Intel para eliminar ruido. Consulte el archivo principal de CMake para saber cómo vincularlo. La compatibilidad con Open Image Denoise se habilita definiendo la opción cmake YOCTO_DENOISE
. OIDN debe instalarse por separado.