Valores da cena
Plano
posição:
cor:
posição
Nenhuma imagem renderizada ainda!
Códigos de shader
Nenhum erro.
Renderizador de imagens
Esse é o renderizador de imagens, uma ferramenta que cria imagens de uma cena tri-dimensional do zero a partir de valores que determinam a cena, com suporte para esferas e luzes.
Como usar:
Na área "Valores da cena" você pode inserir os valores que vão determinar a cena, como coordenadas da camera, intensidade das luzes e etc.
Na área "Códigos de shader" você pode escrever um simples código de pós-processamento que roda após a imagem ser renderizada, ele pode ser escrito na linguagem OpenCL C, porém com diversas restrições, não são permitidos laços(while e for) nem algumas funções padrões do OpenCL C. O programa irá avisar caso seu código gere um erro de compilação. Se Você não conhecer a linguagem, dê uma olhada nos códigos prontos.
Por fim, quando estiver pronto, clique em renderizar e espere a imagem ser gerada, é possível clicar(ou tocar, no celular) na imagem para dar zoom.
Algumas observações: O espectro de cores aceita valores de 0 a 1000(na area de código é de 0 a 1), a intensidade de luzes aceita qualquer valor mas valores acima de 1 serão muito fortes, modificações no plano vão distorcer a imagem e, por ultimo, a quantidade de esferas e luzes aumenta o tempo de criação da imagem consideralmente.
Como as imagens são criadas:
As imagens são criadas calculando o valor de cada pixel ao vivo, usando uma técnica conhecida como phong shading, o programa em si que está rodando por trás pode ser acessado em https://github.com/joaoitaloal/3DRenderer, basicamente a cor de cada pixel é calculada separadamente usando vetores para simular raios de luz.
A teoria para esse projeto, além de implementações em outras linguagens podem ser encontradas em https://avikdas.com/build-your-own-raytracer/, esse é um material muito interessante e em geral não tão dificil de entender, infelizmente ele está inteiro em inglês então se alguém se interessar e não conseguir entender por favor entre em contato comigo([email protected]) que tentarei ajudar(apesar que qualquer IA deve traduzir isso legal já).
Mais sobre os Códigos de shader:
Novamente, a linguagem utilizada é a OpenCL C, uma linguagem de escrita de códigos para gpu baseada em C, você pode encontrar a especificação dela em https://registry.khronos.org/OpenCL/specs/3.0-unified/pdf/OpenCL_C.pdf, porém boa parte do que você poderia fazer com ela está bloqueada aqui por diversos motivos, portanto aqui está uma explicação superficial do que está ou não permitido.
O código que você escrever vai rodar uma vez para cada pixel da imagem, se, por exemplo, você escrever um código que deixa o referido pixel vermelho, todos os pixels da imagem vão ficar vermelhos.
Você tem a sua disposição algumas informações sobre o pixel que está sendo tratado, estas são:
x e y: As coordenadas x e y do pixel na imagem.
WIDTH: A largura da imagem em pixels.
HEIGHT: A altura da imagem em pixels.
pixelcolors: um vetor das cores dos pixels da imagem.
atualVermelho, atualVerde e atualAzul: os indices do espectro rgb(sendo 0 o minimo e 1 o máximo) para o pixelcolors, ou seja, pixelcolors[atualVermelho] = quantidade de vermelho do pixel atual, pixelcolors[atualVerde] = quantidade de verde e etc.
Além disso existem algumas funções prontas para facilitar as coisas:
void somarPixels(float pixelcolors[], int x1, int y1, int x2, int y2): Essa função soma as cores do pixel determinado por x2 e y2 ao pixel determinado por x1 e y1.
void mudarPixelRGB(float pixelcolors[], int x, int y, float red, float green, float blue): Essa função muda as cores do pixel determinado por x e y para os 3 valores passados como red, green e blue.
float3 pegarCorPixel(float pixelcolors[], int x, int y): Essa função é mais complicada, ela retorna a cor do pixel determinado por x e y no formato float3, para acessar as respectivas cores do valor retornado utilize "valor.x", "valor.y" ou "valor.z", sendo os espectros vermelho, verde e azul, respectivamente.
Não são permitidos: laços, chamada de algumas funções prontas do OpenCL(você dificilmente vai usar elas ou até saber da existência delas), acessos diretos em pixelcolors diferentes de 'red', 'green' e 'blue', utilize a função somarPixels se precisar somar pixels de indices especificos diferentes do atual e a função mudarPixelRGB se quiser mudar as cores de um pixel especifico.
Recomendo que utilize as funções prontas e não usar acessos diretos a pixelcolors para modificar os pixels, já que elas facilitam bastante. Se parecer muito dificil fazer algo do 0, dê uma olhada nos shaders prontos, o blur é bem fraco mas se você mudar os +1 e -1 por +5 e -5, por exemplo, ele fica mais forte.