git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
mkdir build &&
cd build &&
cmake .. &&
cmake --build . -j &&
./tinyrenderer ../obj/diablo3_pose/diablo3_pose.obj ../obj/floor.obj
La imagen renderizada se guarda en framebuffer.tga
.
Puede abrir el proyecto en Gitpod, un entorno de desarrollo en línea gratuito para GitHub:
Al abrirlo, el editor compilará y ejecutará el programa, así como también abrirá la imagen resultante en la vista previa del editor. Simplemente cambie el código en el editor y vuelva a ejecutar el script (use el historial del terminal) para ver las imágenes actualizadas.
Mi código fuente es irrelevante. Lea la wiki e implemente su propio renderizador. Sólo cuando sufras todos los pequeños detalles, aprenderás lo que está pasando.
En esta serie de artículos, quiero mostrar cómo funciona OpenGL escribiendo su clon (uno muy simplificado). Sorprendentemente, a menudo me encuentro con personas que no pueden superar el obstáculo inicial de aprender OpenGL/DirectX. Por eso he preparado una breve serie de conferencias, tras las cuales mis alumnos muestran renderizadores bastante buenos.
Entonces, la tarea se formula de la siguiente manera: sin utilizar bibliotecas de terceros (especialmente las gráficas), obtenga algo como esta imagen:
Advertencia: este es un material de capacitación que repetirá vagamente la estructura de la biblioteca OpenGL. Será un renderizador de software. No quiero mostrar cómo escribir aplicaciones para OpenGL. Quiero mostrar cómo funciona OpenGL. Estoy profundamente convencido de que es imposible escribir aplicaciones eficientes utilizando bibliotecas 3D sin entender esto.
Intentaré hacer que el código final tenga unas 500 líneas. Mis alumnos necesitan de 10 a 20 horas de programación para comenzar a crear dichos renderizadores. En la entrada obtenemos un archivo de prueba con un cable poligonal + imágenes con texturas. Como resultado, obtendremos un modelo renderizado, sin interfaz gráfica, y el programa simplemente genera una imagen.
Dado que el objetivo es minimizar las dependencias externas, les doy a mis alumnos solo una clase que les permite trabajar con archivos TGA. Es uno de los formatos más simples que admite imágenes en formatos RGB/RGBA/blanco y negro. Entonces, como punto de partida, obtendremos una forma sencilla de trabajar con imágenes. Debes tener en cuenta que la única funcionalidad disponible desde el principio (además de cargar y guardar imágenes) es la capacidad de establecer el color de un píxel.
No hay funciones para dibujar segmentos de línea y triángulos. Tendremos que hacer todo esto a mano. Proporciono mi código fuente que escribo en paralelo con los estudiantes. Pero no recomendaría su uso, ya que no tiene sentido. El código completo está disponible en GitHub y aquí encontrará el código fuente que les doy a mis alumnos.
# include " tgaimage.h "
const TGAColor white = TGAColor( 255 , 255 , 255 , 255 );
const TGAColor red = TGAColor( 255 , 0 , 0 , 255 );
int main ( int argc, char ** argv) {
TGAImage image ( 100 , 100 , TGAImage::RGB);
image. set ( 52 , 41 , red);
image. write_tga_file ( " output.tga " );`
return 0 ;
}
salida.tga debería verse así: