Gostaria de compartilhar minhas memórias das minhas tentativas de fazer o "mecanismo de gráficos 3D" "faça você mesmo" quase na era pré-Internet (como se ele já estivesse lá em algum lugar, é claro, mas na verdade não tinha um). Nenhuma América foi descoberta, a revolução também não aconteceu, mas houve muito esforço, tormento e fã. Ao longo dos anos, a memória de muitos eventos é apagada, os detalhes desaparecem, as impressões desaparecem - com inúmeras viagens, a caixa de disquetes foi perdida e não houve artefatos dos eventos descritos.
Antecedentes
Os últimos 4 anos de escolaridade ocorreram na escola de educação física de Omsk, onde uma criança (exceto educação física e palavrões) aprendeu a língua C, que, sobrepondo-se ao interesse em gráficos nos jogos, me permitiu escrever algo, tentando perceber o que vi nos jogos da época. . Já era difícil surpreender com gráficos 2D, mas o Wolf 3D me deixou parado por um tempo. Um dos camaradas mais velhos disse: "sim, tudo está nas barras", e isso me permitiu sair do chão. Então percebi que o algoritmo de Bresenham pode ser aplicado ao dimensionamento da coluna da imagem e algum tipo de paródia no Wolf3D começou a funcionar. Não me esforcei para criar algo jogável (que vulgaridade!), Gostei do processo de implementação de algoritmos gráficos, da sensação de que você sabe como é feito e pode fazê-lo. Nas provas finais, optei por fazer informática e apresentei a parte “teórica” aos professores, surpreendendo-os bastante pela presença de uma prática. Mas uma semana antes do exame, eu vi o Descent - um jogo tridimensional real com texturas. Era algo impossível, eu sabia que havia 3DS, mas era necessário muito tempo para renderizar um desenho animado, e então ele voou bem diante dos nossos olhos.
Na graduação, em vez de bater como todas as crianças normais, discuti com os amigos Duke Nukem (ele também é colunista), de quem eu realmente gostei pelo humor e variedade. E então um cara me disse "olhe para Quake". Quando olhei para o kwaku, decidi que era o suficiente para suportar, é impossível, são gráficos 3D reais, sem colunas - e eu absolutamente não entendo como isso é feito.
Eu era habilidoso em geometria
Agora você pode encontrar qualquer informação em 5 minutos, mas o que fazer então? Eu tinha livros sobre gráficos 3D, mas eles não esclareceram a pergunta. Na “Duma”, todas as faces são ativadas na tela em um trapézio, puxando a textura é feita esticando as colunas. Mas, ao mesmo tempo, perdi de vista o fato de que a não linearidade surge horizontalmente e, de fato, o quadro na Duma não é completamente realista. Por isso, perdi o princípio principal dos gráficos 3D, descoberto por Newton - "
linearize-o ". O que se tornará a fonte de todos os problemas e lançamentos subsequentes.
Como já sabemos desenhar um trapézio, vamos "desenhar" na tela cada faceta triangular. Sim, não pode ser pintado com colunas, mas a geometria não é uma coisa muito difícil, vamos passar um raio da câmera por cada pixel da tela e descobrir onde ele cruza o rosto. Isso é praticamente um traçado de raio, apenas leve! Qualquer aluno escreverá esta fórmula em 5 minutos. A equação da reta:
onde
,
estas são as coordenadas do pixel no plano da tela,
essa é a distância da câmera ao plano da tela (câmera no zero do sistema de referência),
- parâmetro
A equação do plano:
onde n é normal, é fácil encontrar o parâmetro (e, portanto, as coordenadas):
Bem, como é fácil, chegue ao reino da
dor da divisão. O computador se dobra bem, multiplica-se de maneira tolerável (não passa de acréscimos e trocas), mas divisão ... A divisão no meu Pentium levou 46 ciclos de relógio. Mesmo 320 a 200, mesmo que nada mais, então para cada quadro você precisa de 3 milhões de medidas. E existem apenas 100 do meu cânhamo, o que significa que, em princípio, você não pode atingir mais de 30 qps. E se a resolução for aumentada em 2 vezes? 7 fps? Mas o jovem entusiasta não ficou envergonhado.
Bem, digamos que calculamos o ponto de interseção com a face, então precisamos resolver dois problemas:
- decidir se desenha uma face neste pixel ou se outra face se sobrepõe
- encontre coordenadas de textura
Classificar árvore
Claro, eu sabia sobre o Z-buffer. Mas acredite, 99% das pessoas que conhecem o buffer Z incorretamente o imaginam, assim como eu o imaginei incorretamente (haverá uma explicação). De qualquer forma, eu queria evitar cálculos desnecessários (as divisões são muito pesadas), então decidi usar outra técnica, lida no livro - árvores de partição de espaço binário, elas também são árvores BSP. Eu sempre amei árvores, o método de classificação por uma árvore sempre me fascinou com sua magia, e aqui estava sua variação - eu depurei 8 horas continuamente, mas consegui!
O método permitiu classificar as faces (ao mesmo tempo, algumas faces foram cortadas em partes) para que, ao serem exibidas, as faces "próximas" fossem desenhadas primeiro, depois as distantes. Portanto, se, ao desenhar o rosto, vi que o pixel já havia sido tirado, podemos avançar com segurança para o próximo pixel, o problema da ordem está resolvido, resta puxar as texturas.
Textura de papel de parede de cola
Coordenadas U, V? Não, eu não ouvi. Mas não me culpe, porque quando você cola o papel de parede, não pensa o mesmo sobre eles. Você acha que tem uma borda do papel de parede (o vetor de textura horizontal), aqui você tem a outra borda do papel de parede (o vetor de textura vertical), você as coloca na parede! Então, para cada face, iniciei 2 vetores para as bordas da textura e, conhecendo o ponto de interseção, encontrei as coordenadas dentro da textura.
Precisamos de um enredo e efeitos.
Renderização conquistada, embora não seja rápida, mas conquistada! Consegui gráficos 3D! Mas o que vamos renderizar? Precisamos de algum tipo de enredo, alguns modelos, precisamos de algum tipo de som.
Um caminhante ou um panfleto? Este caminhante foi e não permite sentir toda a beleza 3D, definitivamente uma mosca! Haverá nossa descida.
Fiz uma plataforma, coloquei vários prédios nela, puxei texturas com janelas, fiz uma fonte de rostos (parecia legal). O que vamos filmar? Eles acertaram as unhas no terremoto, não foi legal. Por alguma razão desconhecida para os culturologistas naquele momento, a palavra “parafuso” (que precisa ser martelada) era popular, e eu percebi que atiraríamos com parafusos - verificou-se que eram parafusos - as ranhuras pareciam muito agradáveis nos parafusos introduzidos no prédio "
O inimigo? Bem, eu não conseguia fazer modelos de pessoas, fiz ... uma ambulância voadora, quase cúbica, apenas inclinou um pouco o pára-brisa. Mas a textura foi salva.
Soa. Os sons de tiros e explosões e o choro que recebi de uma máquina voadora que peguei do warcraft, a trilha sonora iniciaram o acústico O homem que vendeu o mundo - eu próprio ouvia metal, mas sentia pena de meus pais, que tinham que ouvir a mesma coisa à noite enquanto depurava.
No Windows 95, os sons não eram mistos, mas ela, o benefício da universidade, a professora me falou sobre multithreading e eu escrevi o mixer em um fluxo separado - outro sucesso (o Windows 98 será lançado em um ano, onde os sons serão misturados e essa habilidade secreta se tornará inútil).
É possível fazer melhor? Decidi redescobrir a linearização e o pensamento: o que acontecerá se encontrarmos com precisão as coordenadas da textura para as bordas da linha e o interior ficar louco? Eu tentei - tudo começou a funcionar muitas vezes mais rápido, mas graves distorções começaram perto dos edifícios - como em uma sala de espelhos tortos. Correção de perspectiva - não, eu não ouvi.
Bem, desde que eu não ouvi, não há nada a ver com isso, e eu rejeitei esta opção.
Quase o fim da história
No final do primeiro ano, me dignei a participar de um curso especial sobre computação gráfica e mostrei tudo o que havia para o professor. Provavelmente ficamos igualmente surpresos com ele quando ele explicou a interpolação linear de coordenadas e normais de textura, o cálculo aproximado da iluminação, a estimativa do erro de perspectiva e sua correção, e eu mostrei a ele algo realmente funcionando.
No segundo ano, tentei refazer tudo com base em novos conhecimentos, mas o ano padrão era 98 e vi o segundo terremoto no acelerador 3D - era fabulosamente bonito. Então não havia dinheiro da palavra, o acelerador era como uma nave espacial, por algum motivo, decidi que não o teria em um futuro próximo. E o interesse pela programação gráfica começou a desaparecer rapidamente - mas fiquei empolgado com a ideia de processar o som. Mas isso é outra história
As coordenadas de textura PS real mudam de maneira não linear, para velocidade, elas são substituídas por lineares. Mas o que acontece com a coordenada Z e por que eles invertem Z durante a transformação? A resposta a esta pergunta é dada pelo buffer Z.