2021-06-16 – Game Engine já a renderizar em 3D, à pata (sem GPU ou OpenGL), em C/C++…
O meu Game Engine a tornar-se 3D também, e não apenas 2D.
Comecei a preparar o meu Game Engine em C/C++ para funcionar em 3D também, e já explico abaixo o que cada imagem é.
E atenção que o que vêem, é renderização 3D feita “à mão”, e não através de facilitismos como OpenGL ou outros, que explico abaixo e por razões que explico abaixo.
A ideia começou quando estava a criar as simulações de colisões de galáxias, e me apercebi de que as da NASA/Hubble, etc, eram muito superiores por serem em 3D. E como estava a usar o meu Game Engine para as minhas, em 2D, percebi que tinha de o adaptar para 3D.
E assim, apesar de o meu foco no Futuro serem jogos em 2D e não em 3D, o meu Game Engine será totalmente adaptável tanto a 2D como a 3D, não só para jogos, como para simulações de Física, colisões de galáxias, etc!
Como sempre, gosto de fazer tudo do zero, e considero isso bom, para saber como funciona tudo o que estou a usar, evitando ao máximo código feito por terceiros.
E isso não significa apenas que crie um Game Engine do zero em C/C++ ao invés de usar algo com tudo pré-feito onde alguém que mal saiba programar consegue criar jogos, como o Unity, mas também que eu evitei usar OpenGL, e isso tem as suas vantagens e desvantagens…
Desvantagens de não usar OpenGL:
1 – Estou a fazer a renderização com o próprio CPU e não com os da Placa Gráfica (GPU), e sendo assim, terei muito menos FPS, será mais lento;
2 – É mais complicado, porque ao invés de usar funções OpenGL que fazem tudo facilmente, tenho de fazer todos os cálculos matemáticos à pata;
Vantagens de não usar OpenGL e fazer à pata:
1 – Não ficando dependente do OpenGL, poderei usar em mais plataformas que não tenham OpenGL, como máquinas super antigas, como Amiga, etc, o que é ideal para retro-gaming;
2 – Dá mais desafio e é mais giro;
3 – Ao ter de fazer tudo à pata, reforço os meus conhecimentos na área;
Mas a primeira vantagem é a principal.
Além disso, não tenciono criar jogos super pesados em 3D, pelo que não vou assim tanto necessitar de usar o GPU das máquinas, mas tenho o código muito abstraído do hardware, pelo que se preciso, um dia criar algo que requira mais poder de processamento, poderei usar o OpenGL na mesma. 🙂
Vou explicar o que podem ver na imagem, que foi o que criei nas semanas anteriores…
Começamos pelo canto inferior direito, onde podem ver o início do processo, que foi a geração inicial de cubos em 3D mas numa projecção ortográfica e não perspectiva.
À esquerda dessa imagem, vêem a criação de uma rede/grid a ir até ao horizonte, com alguma convexidade, e acima, o cruzamento dos cubos com a rede, para testar rotações independentes de diferentes objectos 3D num plano maior.
Depois conseguem ver duas imagens de fractais, porque para variar um pouco e não me cansar da mesma coisa, brinquei com fractais, criando novos fractais como gosto de fazer. No canto superior direito, contudo, podem ver o normal de MandelBrot…
Voltando ao 3D… Abaixo, no centro-direita, podem ver as primeiras tentativas falhadas de usar fios de arame para desenhar objectos, naquela imagem em que há fios a ir para todos os lados menos os que eu queria. 😀
Mas no meio abaixo, já podem ver dois exemplos funcionais, mas tenho de vos dizer que tanto esses dois exemplos (o diamante, e a árvore), como o de cima (uma nave retirada do jogo Wipeout), não foram desenhados por mim, obviamente, mas por criadores cujos nomes colocarei neste post no meu website depois.
Mas podem ver que já fazia os wire-frames desses objectos, e também já conseguia pintar os triângulos/polígonos que os comunham, com cores aleatórias e tons difusos, que fica bonito e que já vi fazerem no Passado.
Há um problema, eu pareço não poder juntar todos os vértices de todos os polígonos porque por vezes vêm mal criados pelas aplicações, pelo que penso (ainda tenho de investigar se é problema meu ou deles). Daí as árvores não estarem bem nas imagens.
E por fim, acima, têm exemplos da minha tentativa de projectar texturas na nave do Wipeout, mas não conseguia ainda projectar as imagens que vinham com a nave gerada pelo artista, porque ainda só consigo (porque não tive tempo de criar o resto dos algoritmos), adaptar uma textura no geral a todas as superfícies, e não texturas específicas a cada polígono.
Aliás, consigo mais ou menos, mas não consigo é ler o ficheiro obj que eles dão, e sacar de lá a informação, e sendo assim aplico uma textura que procurei na net, de pedra, à nave, que lhe deu um tom brutal. 🙂
Ahh, e a do meio, era supostamente uma textura de metal, e ficou altamente.
Eu consigo a aplicação de texturas específicas, com interpolação dos píxeis e tudo, mas tenho aplicado a mesma a tudo, é mais fácil.
Esqueci de referir que também já tenho pontos de luz aplicados na imagem, só faltam as sombras. E quem sabe um dia reflexos, etc…
E penso que não me vou dar ao trabalho de ler 100% bem os ficheiros wavefront de extensão .obj, até porque para jogos que crie, serei eu a desenhar os objectos e não outros. Mas talvez adapte um dia anyway…
Nos próximos meses deixarei de lado o motor 3D em princípio, e focar-me-ei na exposição em 3D de pontos, apenas para a geração de galáxias.
Mas ao menos um dia se quiser criar jogos em 3D, já tenho isto mais avançado.
Pronto, já expliquei muita coisa aqui.
De qualquer das formas lembrem-se, que assim puxa mais o CPU, fica mais lento porque não usa a GPU, não uso OpenGL, mas com isso poderei usar em todo o lado, até em máquinas antigas.
Adicionei umas dezenas de ficheiros ao meu Game Engine com isto tudo. Recordem que estou a criar do zero o Game Engine, isto é bem mais trabalhoso do que simplesmente pegar num já criado na net e criar jogos com ele. 😀
E é mais divertido. Divertido, se acharem piada a Trigonometria, Matrices, Vectores, senos, cosenos, tangentes, polígonos, 1001 contas, e 1001 coisas mais. 😛
Mais tarde trago mais novidades.
Hasta! 😛
2021-06-16.
Pequeno post partlhiado no LinkedIn com esta imagem em 2021-06-16:
«Isto é o que tenho feito nas últimas semanas: a adaptação do meu Game Engine em C/C++, de 2D para 3D também.
Não é que eu queira criar jogos em 3D, mas precisava de ter o 3D funcional para as minhas simulações de galáxias, etc, e assim tenho um 2 em 1, faço o que preciso, e ao mesmo tempo, o meu Game Engine fica mais preparado para jogos 3D.
Claro que seria facílimo ter um Unity onde qualquer pessoa que mal saiba programar, pode criar jogos.
Mas isto é feito do zero em C/C++, para ter algo mais leve e poderoso, e mais ao meu gosto.
E como tal, não usei OpenGL nisto, toda a Matemática do 3D é feita à pata. Com isto, estou a usar mais CPU e menos GPU, o que torna mais lento, mas repito, tambẽm não vou criar jogos super pesados em 3D por isso no problem. E assim poderei usar em máquinas antigas sem Open GL. 🙂
E o ser feito à pata é mais giro.
Usei objectos 3D grátis da Internet para as imagens com que fiz os testes.
E pelo meio brinquei com fractais.
Seria muito longo um texto a descrever tudo o que fiz, se quiserem saber mais, leiam o que cada imagem aqui significa, e o que fiz, no meu site pessoal.
E mais tarde partilho mais coisas, mas penso que antes de voltar aos trading systems, talvez dê uns toques nas galáxias primeiro. 🙂
Hasta.
2021-06-16.»
In: https://www.linkedin.com/feed/update/urn:li:activity:6810842868069015552/.