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
A imagem renderizada é salva em framebuffer.tga
.
Você pode abrir o projeto no Gitpod, um ambiente de desenvolvimento online gratuito para GitHub:
Ao abrir, o editor irá compilar e executar o programa, bem como abrir a imagem resultante na visualização do editor. Basta alterar o código no editor e executar novamente o script (usar o histórico do terminal) para ver as imagens atualizadas.
Meu código-fonte é irrelevante. Leia o wiki e implemente seu próprio renderizador. Somente quando você sofrer com todos os pequenos detalhes, você saberá o que está acontecendo.
Nesta série de artigos, quero mostrar como o OpenGL funciona escrevendo seu clone (muito simplificado). Surpreendentemente, muitas vezes encontro pessoas que não conseguem superar o obstáculo inicial de aprender OpenGL/DirectX. Assim, preparei uma pequena série de palestras, após as quais meus alunos apresentam renderizadores muito bons.
Portanto, a tarefa é formulada da seguinte forma: sem usar bibliotecas de terceiros (especialmente gráficas), obtenha algo como esta imagem:
Atenção: este é um material de treinamento que irá repetir vagamente a estrutura da biblioteca OpenGL. Será um renderizador de software. Não quero mostrar como escrever aplicações para OpenGL. Quero mostrar como o OpenGL funciona. Estou profundamente convencido de que é impossível escrever aplicações eficientes usando bibliotecas 3D sem compreender isso.
Tentarei fazer o código final com cerca de 500 linhas. Meus alunos precisam de 10 a 20 horas de programação para começar a criar esses renderizadores. Na entrada obtemos um arquivo de teste com fio poligonal + imagens com texturas. Na saída, obteremos uma interface gráfica sem modelo renderizada, e o programa simplesmente gera uma imagem.
Como o objetivo é minimizar dependências externas, dou aos meus alunos apenas uma aula que permite trabalhar com arquivos TGA. É um dos formatos mais simples que suporta imagens nos formatos RGB/RGBA/preto e branco. Assim, como ponto de partida, obteremos uma forma simples de trabalhar com imagens. Você deve observar que a única funcionalidade disponível no início (além de carregar e salvar imagens) é a capacidade de definir a cor de um pixel.
Não há funções para desenhar segmentos de linha e triângulos. Teremos que fazer tudo isso manualmente. Forneço meu código-fonte que escrevo em paralelo com os alunos. Mas eu não recomendaria usá-lo, pois isso não faz sentido. O código completo está disponível no GitHub, e aqui você encontrará o código fonte que dou aos meus alunos.
# 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 ;
}
output.tga deve ser parecido com isto: