Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

SaguRaytracer

A tiny cross-platform object pascal raytracer

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

Sagu Raytracer

A tiny cross-platform object pascal raytracer

Baseado inicialmente no Delphi-tinyraytracer que por sua vez é baseado no ssloy tinyraytracer.

Implementado em Object Pascal usando Lazarus/FPC e Delphi com o objetivo de ser utilizável tanto no Windows quanto Linux. É uma aplicação de console/CLI que lê um arquivo JSON contendo a descrição de uma cena 3D e renderiza ela, gerando um arquivo de imagem gráfica, no formato PPM (Portable PixMap) no momento.

A ideia inicial é que essa aplicação sirva como um teste de benchmark entre os executáveis gerados em Lazarus/FPC e Delphi além das plataformas de destino, Windows ou Linux.

O projeto segue um principio de ser o mais simples possível, não dependendo de nenhuma biblioteca de terceiros. Usando apenas as ferramentas nativas disponíveis nos ambientes de desenvolvimento tal qual fossem recém instalados.

Algumas considerações

  • O uso de estruturas de dados que ocupam a stack em vez da heap nos calculos mais intesivos melhora consideravelmente a performance. Por isso os TVectors são records e não classes. Durante a renderização o algoritmo deve iterar por todos os objetos da cena para descobrir onde o raio bateu mais próximo a câmera. Usando TLists que armazenam objetos no heap essa iteração ficou mais lenta do que se usar arrays que ficam na stack também.
  • O uso de métodos inline gera ganho de desempenho como esperado.
  • Os calculos dos TVectors foram armazenados como métodos desses records em vez de serem funções soltas. Isso serve para criar expressões de cálculos mais fluentes e fáceis de ler.
  • Os executáveis gerados sem o uso de processamento paralelo pelo Lazarus/FPC parecem ser 30% mais rápidos que os gerados em Delphi nas análises que fiz até o momento, configurando o nível de otimização de ambos os compiladores para o máximo possível.
  • Não comparei os desempenhos usando processamento paralelo nos dois compiladores. Mas, o melhor tempo de renderização do Delphi-tinyraytracer usando a PPL do Delphi foi praticamente igual ao melhor tempo do Sagu Raytracer compilado no Lazarus/FPC sem processamento paralelo. É claro que o tinyraytracer não é uma aplicação console, e não tem muita otimização no momento, fazendo a comparação um pouco injusta, mas não totalmente, pois creio que mesmo com elas, o resultado não seria muito melhor. Por exemplo, o uso de métodos inline no Lazarus/FPC mostrou um ganho de performace de 30%, enquanto que no Delphi o ganho foi bem menor que isso. (As tabelas com comparativos virão em breve)

To Do

  • Verificar o uso de operator overloading.
  • Processamento paralelo no Lazarus/FPC.
  • Mais formas geométricas.
  • Carga de arquivos OBJ.
  • Métodos de cálculos fluentes retornarem ponteiros para o objeto original alterado em vez de criarem novos objetos, fazendo um "reaproveitamento de variáveis" mais sofisticado e com isso ganhar desempenho ao não precisar alocar mais memória.
  • Adicionar renderização baseado em Path Tracing. Ver tutoriais do Raytracing in One Weekend para isso.
  • Arquitetura API para usar em testes de outros tipos de aplicação (Web APIs REST, etc).

Porquê Sagu? Por que eu estava fazendo sagu na hora que tive a ideia deste projeto.