Esta es una demostración de representar texto directamente en la GPU utilizando los contornos del vector definidos por la fuente.
Los contornos de un glifo se convierten en una lista de curvas bisier cuadráticas individuales (definidas por sus puntos de control), que se cargan a la GPU.
Se genera un quad para cada glifo y el sombreador de píxeles determina si cada píxel está dentro o fuera del glifo. Para hacer esto, el número de devanado del píxel se calcula cruzando un rayo con las curvas Bezier. En cada intersección, el rayo entra o sale del área llena determinada por la dirección de la curva Bezier en relación con el rayo. En cada salida, el número de devanado aumenta en uno y en cada entrada, el número de devanado disminuye en uno. Después de considerar todas las intersecciones, el número de devanado no será cero si el píxel está dentro del contorno.
La dirección de los rayos no importa para este cálculo del número de devanado, pero las matemáticas pueden simplificarse enormemente mediante el uso de rayos paralelos al eje X. Al restar la posición de la muestra de los puntos de control de las curvas Bezier, el sistema de coordenadas se desplaza para que el origen del rayo esté en
Para encontrar las intersecciones entre un rayo y una sola curva Bezier, recuerde que la siguiente fórmula describe una curva de Bezier cuadrática (para el fondo sobre curvas Bezier, ver belleza e imprimación):
Tomar solo el componente Y y aplicar la condición
Que se puede reorganizar en:
Para que se pueda resolver usando la fórmula cuadrática:
Sustitución
La ecuación cuadrática puede tener cero, una o dos soluciones. Además, una solución
En este punto, se han identificado las intersecciones entre el rayo y la curva Bezier, pero aún necesitan ser clasificadas como entrada o salida. La demostración proporcionada por Dobbie calcula explícitamente la derivada de la curva Bezier para cada
Por lo tanto, la curva Bezier cruza el eje x en una dirección fija en cada solución y, combinada con la convención para la orientación del contorno,
Un enfoque diferente para comprender esta relación es notar que, debido a los diferentes signos utilizados en las soluciones y la raíz cuadrada no es negativa,
Si el parámetro
El anti-alias a lo largo de la dirección de los rayos se implementa considerando una ventana del tamaño de un píxel alrededor del origen del rayo. Si una intersección cae en esta ventana, entonces el número de devanado se cambia solo fraccionalmente para calcular la cobertura del píxel. El peso fraccional está determinado por la distancia desde el borde izquierdo del píxel (esto es consistente con los rayos que apuntan a la derecha). Al considerar las secciones individuales, se puede ver que esto calcula la cobertura unidimensional exactamente.
Tenga en cuenta que ahora tenemos que considerar las intersecciones ligeramente detrás del origen de rayos, pero la implementación primero calcula cualquier intersección con el eje X y luego verifica la posición X, por lo que no cambia mucho. Una forma diferente de pensar sobre esto es que la condición
Para el anti-aliasing completo, podemos usar múltiples rayos a lo largo de diferentes direcciones (por ejemplo, una a lo largo del eje X y uno a lo largo del eje Y).
Este tipo de técnica está sujeta a artefactos de la precisión numérica limitada de los números de puntos flotantes. La imagen a continuación muestra una instancia de tales artefactos cuando se acerca completamente (y sabe dónde mirar). Sin embargo, he encontrado que esta implementación ya es bastante estable. Cualquier artefacto restante podría eliminarse utilizando el algoritmo de Slug, que no se implementa aquí debido a la patente asociada.
Esta demostración tampoco implementa ninguna optimización de rendimiento (como las bandas) y puede tener un alto uso de GPU en algunos escenarios y cuando se usa fuentes muy complejas.

Clone el proyecto recursivamente para inicializar los submódulos para las dependencias (o ejecutar git submodule update --init si ya ha clonado el repositorio):
git clone --recursive https://github.com/GreenLightning/gpu-font-rendering.git
cd gpu-font-rendering
# Note: CMake will create the build directory.
cmake -S . -B build
make -j8 --directory build
En Windows, es posible que desee usar CMake GUI y/o Visual Studio.
En Linux, es posible que deba instalar paquetes adicionales para el desarrollo de OpenGL (por ejemplo sudo apt-get install xorg-dev libgl1-mesa-dev para ubuntu).
./build/main
El programa requiere que los directorios fonts y shaders estén en el directorio actual para cargar sus recursos. Si solo obtiene una ventana negra , es probable que este sea el problema. Verifique su directorio de trabajo y revise la consola en busca de errores.
Probado en Windows 10, MacOS Monterey y Ubuntu 22.04.