A la primera part, on analitzem amb més profunditat la creació de jocs en 3D, ens centrarem completament en la fase superior del procés. Això vol dir arrossegar els nostres manuals de matemàtiques, fer pinzellades en àlgebra lineal, matrius i trigonometria.

Potenciarem com es transformen els models 3D i com es calculen les fonts de llum. S’investigaran a fons les diferències entre els ombres de cantonades i de geometria i veureu on s’adapta la tessel·lació. Per ajudar les explicacions, utilitzarem diagrames i exemples de codi per mostrar com es manegen les matemàtiques i els números en un joc. Si no esteu preparat per tot això, no us preocupeu; podeu començar. Representació 3D de jocs 101. Tanmateix, un cop configurat, seguiu llegint per conèixer el món dels gràfics en 3D.

Quin és el propòsit?

En el món de les matemàtiques, un punt és simplement una posició dins d’un camp geomètric. No hi ha res més petit que un punt, ja que no té mida, de manera que es poden utilitzar per definir clarament on comencen i acaben objectes com ara línies, plans i volums.




Per als gràfics en 3D, aquesta informació és crucial per determinar com quedarà tot, ja que tot el que es mostra és una línia, un pla, etc. Col · lecció. La imatge següent és una captura de pantalla del llançament de 2015 de Bethesda. Fallout 4:




Pot ser una mica difícil veure com només són una gran pila de punts i línies, de manera que us mostrarem com es veu la mateixa escena en mode "wireframe". El motor de representació 3D salta les textures i els efectes realitzats a l’etapa de píxels i no dibuixa més que línies de colors que connecten els punts.







Ara tot sembla molt diferent, però podem veure diversos objectes, l’entorn i totes les línies que s’uneixen per crear el fons. Algunes són només un grapat de línies, com les roques en primer pla, mentre que d’altres tenen prou línies per semblar sòlides.

Tots els punts al principi i al final de cada línia s’han treballat amb moltes matemàtiques. Alguns d'aquests càlculs són molt ràpids i fàcils; d’altres són molt més difícils. Hi ha guanys significatius en el rendiment treballant junts en grups de punts, sobretot en forma de triangle, així que donem una ullada més detallada a aquests.




Què cal per a un triangle?

Nom triangle ens diu que la forma té 3 angles interns; Per a això necessitem 3 cantonades i 3 línies que connectin les cantonades. Nom correcte de la cantonada turó (els vèrtexs són la paraula plural) i cadascun està definit per un punt. Com que ens basem en un món geomètric en 3D, Sistema de coordenades cartesianes per punts. Normalment s’escriu junts com a 3 valors, per exemple (1, 8, -3) o més generalment (X ve Z).

A partir d’aquí, podem afegir dos vèrtexs més per obtenir un triangle:




Tingueu en compte que les línies que es mostren no són realment necessàries: només podem tenir punts i podem dir al sistema que aquests 3 vèrtexs formen un triangle. Totes les dades del vèrtex s’emmagatzemen en un bloc contigu de memòria anomenat a para-xocs de cantonada; La informació sobre la forma que faran es codifica directament al programa de representació o s’emmagatzema en un altre bloc de memòria. memòria intermèdia de directoris.

En el cas dels primers, s’anomenen diferents formes que es poden formar a partir de les cantonades primitiu Direct3D presenta llista, tires i ventiladors en forma de punt, línia i triangle. Si s’utilitzen correctament, les ratlles triangulars ajuden a millorar el rendiment mitjançant l’ús de cantonades per a diversos triangles. A l'exemple següent, podem veure que només calen 4 cantonades per unir 2 triangles; si estiguessin separats, necessitaríem 6 vèrtexs.

Si voleu cobrir una col·lecció més gran de racons, per exemple. un model de joc NPC, després un - Aquest és un altre bloc de memòria, però consta de múltiples memòries intermèdies (vèrtex, índex, etc.) i recursos de textura per al model. Microsoft proporciona una introducció ràpida a aquests usos de memòria intermèdia. documents en línia font.

De moment, centrem-nos en el que es fa amb aquests racons en un joc en 3D, cada vegada que es crea un nou marc (si no esteu segur del que significa això, torneu a fer un ràpid escombrat) renderitzar 101). En poques paraules, se'ls fa una o dues coses:

  • Mou el vèrtex a una ubicació nova
  • Canvieu el color de la cantonada

A punt per fer algunes matemàtiques? Bé! Perquè així es fa.

Introduïu el vector

Imagineu que hi ha un triangle a la pantalla i que premeu un botó per moure’l cap a l’esquerra. Naturalment (X ve Z) els números de cada vèrtex varien en conseqüència i són; però, Com Pot semblar una mica inusual. La gran majoria dels sistemes de representació de gràfics 3D, en lloc de canviar les coordenades, utilitzen una eina matemàtica específica per fer la feina: vectors.

Es pot considerar que un vector és una fletxa que apunta a un lloc específic de l’espai i pot tenir la longitud necessària. Les cantonades es descriuen realment utilitzant vectors basats en coordenades cartesianes d'aquesta manera:

Fixeu-vos en com comença la fletxa blava en un lloc (en aquest cas, Origen) i s’estén fins al pic. Vam fer servir el que es deia cnotació olumn per descriure aquest vector remar la notació també funciona. També notareu que hi ha un valor addicional més: el quart número sol ser amb component w i s'utilitza per indicar si el vector s'utilitza per descriure la posició d'un vèrtex ( posició vectorial) o un aspecte general (a la nit vector). En el cas d’aquest últim, quedarà així:

Aquest vector apunta en la mateixa direcció i té la mateixa longitud que el vector de posició anterior, de manera que (X ve Z) els valors seran els mateixos; Però w-els vectors components són zero en lloc d'1. L’ús dels vectors de direcció s’aclarirà més endavant en aquest article, però per ara considerem el fet que tots els punts de cantonada de l’escena 3D es definiran d’aquesta manera. Per què? Perquè amb aquest format, es fa molt més fàcil començar a moure’ls.

Matemàtiques, matemàtiques i més matemàtiques

Recordeu que tenim un triangle bàsic i el volem moure cap a l’esquerra. Cada vèrtex està definit per un vector de posició, de manera que hem de fer les "matemàtiques en moviment" ( conversions) ha de treballar en aquests vectors. Introduïu el vehicle següent: sèrie (o mare per a un d’aquests). Es tracta d'una sèrie de valors escrits com a files i columnes, semblant a un full de càlcul d'Excel.

Per a cada tipus de transformació que vulguem fer, hi ha una matriu associada que va amb ella, i és només el cas de multiplicar la matriu de transformació i el vector de posició junts. No repassem els detalls específics de com i per què passa això, però podem veure el seu aspecte.

Mou el vèrtex a l’espai 3D traducció i el càlcul necessari és:

x0etc. els valors representen les coordenades originals del vèrtex; delta-x Els valors indiquen quant s’ha de moure el pic. El càlcul de matrius-vector resulta simplement sumar els dos junts ( w el component es manté intacte, de manera que la resposta final continua sent un vector de posició).

A més de moure les coses al voltant, és possible que vulguem girar el triangle o escalar-lo a una mida més gran o més petita; hi ha transformacions per a tots dos.

Eina gràfica alimentada per WebGL Lloc web de renderització en temps real per visualitzar aquests càlculs en tota una figura. Comencem per un cuboide en una ubicació predeterminada:

En aquesta eina en línia, el punt model es refereix al vector de posició, la matriu terrestre és la matriu de transformació i el punt espacial terra és el vector de posició del vèrtex transformat.

Ara apliquem diverses transformacions al cuboide:

A la imatge superior, la figura traducció 5 unitats en cada sentit. Podem veure aquests valors a la gran matriu mitjana, l’última columna. El vector de posició original (4, 5, 3, 1) roman com hauria de ser, però el vèrtex transformat es tradueix ara com (9, 10, 8, 1).

En aquesta transformació, tot es va escalar dues vegades: el cuboide té ara els costats el doble. L'últim exemple a considerar és un punt d'inflexió:

El cuboide es gira amb un angle de 45 °, però la matriu els seus ve cosinus inclinar-lo. Una revisió ràpida de qualsevol calculadora científica sense (45 °) = 0,7071 ... arrodoneix al valor 0,71 que es mostra. Tenim la mateixa resposta cosinus valor.

No cal utilitzar matrius i vectors; una alternativa comuna per manejar rotacions, nombres complexos i complexos kuaterniyonlar. Aquestes matemàtiques són un gran pas respecte als vectors, de manera que passarem per transformacions.

El poder del pic ombrívol

En aquesta etapa, hem de considerar que totes aquestes persones les han de resoldre les persones que programen el codi de construcció. Si un desenvolupador de jocs utilitza un motor de tercers (com Unity o Unreal), això ja es farà per a ells, però qualsevol que faci els seus propis càlculs des de zero haurà d'esbrinar quins racons ha de fer.

Quin aspecte té, doncs, en termes de codi?

Utilitzarem exemples del lloc web excel·lent per ajudar-vos amb això. Braynzar Soft. És un lloc fantàstic per aprendre els conceptes bàsics i coses més avançades si voleu començar a programar 3D vosaltres mateixos.

Aquest exemple és la transformació "tot en un". Crea les matrius de transformació corresponents basades en una entrada de teclat i després les aplica al vector de posició original en una sola operació. Recordeu que sempre es fa en un ordre determinat (escala - rotació - volteig) perquè qualsevol altra forma farà malbé el resultat.

Es denomina aquest tipus de blocs de codi ombrejadors de turons i poden variar molt segons el que facin, la seva mida i complexitat. L'exemple anterior és tan senzill i innegable com vénen només un ombrejat perquè no utilitza la naturalesa totalment programable dels shaders. Un conjunt més complex de shaders el pot transformar en espai 3D, calcular com apareixerà l’escena a la càmera i transferir aquestes dades a la següent etapa del procés de renderització. Veurem més exemples a mesura que anem recorrent la seqüència de retallada de cantonades.

Per descomptat, es poden utilitzar per a molt més, i recordeu que cada vegada que jugueu a un joc jugat en 3D, tots els moviments que podeu veure els realitza el processador gràfic, seguint les instruccions dels shaders de les cantonades.

Tot i això, no sempre va ser així. Remuntant-se a mitjan dècada de 1990, les targetes gràfiques d’aquella època no tenien la capacitat de manejar els angles primitius i ells mateixos, tots realitzats íntegrament a la CPU.

Un dels primers processadors a proporcionar acceleració de maquinari dedicada per a aquest tipus de processament GeForce original de Nvidia es va publicar el 2000 i aquesta propietat ha estat etiquetada Conversió i il·luminació de maquinari (o en breu Hardware TnL). Les operacions que aquest maquinari podia gestionar eren molt estrictes i constants en termes d’ordres, però van canviar ràpidament a mesura que es van llançar nous xips gràfics. Avui en dia no hi ha cap maquinari separat per al processament de cantonades i les mateixes unitats ho gestionen tot: punts, primitius, píxels, textures, etc.

Parlant sobre il·luminació, cal tenir en compte que tot el que veiem és, per descomptat, causat per la llum, així que anem a veure com es pot manejar a la fase màxima. Per fer-ho, utilitzarem alguna cosa que hem esmentat anteriorment en aquest article.

Llums del motor de la càmera!

Imagineu aquesta escena: l’actor es troba en una habitació fosca il·luminada per una única font de llum a la dreta. Al mig de l'habitació hi ha una tetera grossa flotant gegant. D'acord, probablement necessitarem una mica d'ajuda per visualitzar-ho Lloc web de renderització en temps real, per veure alguna cosa així en acció:

Tingueu en compte que aquest objecte és una col·lecció de triangles rectes cosits; Això significa que el pla de cada triangle apuntarà en una direcció determinada. Alguns miren la càmera, d’altres cap al revés, mentre que d’altres estan torts. La llum de la font colpeja cada pla i rebota en un angle determinat.

Depenent d'on vagi la llum, el color i la brillantor del pla canviaran, i cal calcular-los i calcular-los per garantir que el color de l'objecte aparegui correcte.

Per començar, hem de saber a quina direcció s’enfronta l’avió i per a això vector normal avió. Aquesta és una altra fletxa, però a diferència del vector de posició, la mida no té importància (de fet, sempre escalen després del càlcul, de manera que tenen exactament una unitat de longitud) i sempre dik pla (angle recte).

La normalitat del pla de cada triangle, el producte vectorial dels dos vectors de direcció (p ve q Es mostra a la part superior) formen els costats del triangle. En realitat, és millor treballar per a cada vèrtex i no per a cada triangle, però tenint en compte que sempre serà més que l'anterior en comparació amb aquest últim, és més ràpid fer-ho només per a triangles.

Després d’arribar a la normalitat d’una superfície, podeu començar a tenir en compte la font de llum i la càmera. Les llums poden ser de diferents tipus a la representació 3D, però només a efectes d’aquest article direccional llums, per exemple. un focus. Igual que el pla d’un triangle, el focus i la càmera apuntaran en una direcció determinada, potser alguna cosa així:

El vector de la llum i el vector normal es poden utilitzar per trobar l’angle en què la llum colpeja la superfície (utilitzant la relació entre el producte punt dels vectors i el producte de les seves dimensions). Els vèrtexs del triangle portaran informació addicional sobre els seus colors i materials; en aquest darrer cas, explica què passa amb la llum quan toca la superfície.

Una superfície llisa i metàl·lica reflectirà gairebé tota la llum entrant en l’angle d’on prové i difícilment canviarà de color. En canvi, un material aspre i apagat dispersa la llum d’una manera menys previsible i canvia de color subtilment. Per tenir-ho en compte, els punts de les cantonades han de tenir valors addicionals:

  • Base de color original
  • Propietat material ambiental: un valor que determina la quantitat de llum de fons que el vèrtex pot absorbir i reflectir
  • Propietat del material difós: un altre valor, però aquesta vegada mostra com de gruixut és el pic, això afecta la quantitat absorbida i reflectida de la llum dispersa
  • Propietats del material especulatiu: dos valors que permeten mesurar el grau de "brillantesa" del pic

Diferents models d'il·luminació utilitzen diverses fórmules matemàtiques per agrupar-les totes i el càlcul produeix un vector per a la llum incident. Això es combina amb el vector de la càmera, es pot determinar l’aspecte general del triangle.

Hem revisat els detalls més detallats aquí i per una millor raó: agafeu qualsevol llibre de text sobre representació 3D i veureu tots els capítols dedicats a aquest procés únic. No obstant això, els jocs moderns solen realitzar la majoria dels càlculs de la il·luminació i dels efectes materials en l'etapa de càlcul de píxels, de manera que tornarem a tractar aquest tema en un altre article.

Tot el que hem cobert fins ara s’ha fet amb ombrívols i pot semblar que gairebé no hi ha res que puguin fer; Malauradament hi ha. Els shaders de cantonada no poden crear nous punts de cantonada i cada ombrejat ha de treballar en cada vèrtex. Hauria estat útil si hi hagués una manera d’utilitzar un petit codi per crear més triangles, una manera de tenir un ombrejat funcionant entre allò que ja tenim (per millorar la qualitat visual) i sobretot primitiu (per accelerar les coses). fins que). Amb processadors gràfics moderns, Llauna Fer això!

Si us plau, senyor, en vull més (triangles)

Els últims xips gràfics són extremadament potents, capaços de fer milions de càlculs vectorials de matriu cada segon; poden passar fàcilment sobre una gran pila de cantonades en poc temps. D'altra banda, la creació de models molt detallats requereix molt de temps i, si el model es quedarà una mica fora de l'escena, es malgastaran tots aquests detalls addicionals.

El que necessitem és una manera d’indicar al processador que el divideixi en una primitiva més gran, una col·lecció de triangles més petits que estan connectats a l’interior de l’original més gran, com el simple triangle recte que estem veient. El nom d'aquest procés: tessel·lació i els xips gràfics ho han pogut fer durant molt de temps; El que ha millorat al llarg dels anys és la quantitat de control que tenen els programadors durant l'operació.

Per veure-ho en acció, utilitzarem: l'eina de referència Paradise d'Unigine, ja que ens permet aplicar quantitats variables de tessel·lació als models específics utilitzats a la prova.

Per començar, prenem un lloc al punt de referència i l'examinem sense aplicar el mosaic. Aneu amb compte que les llambordes del terra semblin massa falses; la textura utilitzada és eficaç, però no es veu bé. Apliquem un mosaic a l’escena; Unigine aplica el motor només a determinades parts, però la diferència és dramàtica.

Ara el terra, les vores de l’edifici i la porta semblen molt més realistes. Si tornem a executar el procés, podem veure com s’aconsegueix això, però aquesta vegada amb les vores de les primitives ressaltades (mode wireframe):

Podem veure clarament per què el terra sembla tan estrany: completament pla! La porta també està a ras de les parets i les vores de l’edifici no són més que simples cubs.

A Direct3D, els elements primitius es poden dividir en un grup més petit de parts ( compartiment inferior) Executant una seqüència de 3 etapes. En primer lloc, els programadors ombra corporal - bàsicament, aquest codi és un pegat de geometria. Imagineu-ho com un mapa que indica al processador on apareixeran els nous principis i línies dins de la primitiva inicial.

A continuació, la unitat de teselador dins del processador gràfic aplica el pegat al principi. Finalment, ombrejat d’àrea calcula les posicions de totes les cantonades noves. Aquestes dades es poden tornar a introduir a la memòria intermèdia del vèrtex segons calgui, de manera que es poden tornar a fer càlculs de llum, però aquesta vegada amb millors resultats.

Quin aspecte té, doncs? Disparem la versió wireframe de l'escena del mosaic:

La veritat és que establim el nivell de tessel·lació a un nivell bastant extrem per ajudar a explicar el procés. Tan bons com els xips gràfics moderns, no és una cosa que voldríeu fer en tots els jocs; per exemple, agafeu el fanal per la porta.

A les imatges sense fils, se us empeny a descriure la diferència en aquesta distància i podeu veure aquest nivell de tessel·lació agrupat en massa triangles, alguns dels quals són difícils de dir. Tot i així, s’utilitza correctament i aquesta funció de representació de cantonades pot donar lloc a uns efectes visuals excel·lents, sobretot quan s’intenta simular col·lisions suaus del cos.

A les imatges sense fils, se us empeny a descriure la diferència en aquesta distància i podeu veure aquest nivell de tessel·lació agrupat en massa triangles, alguns dels quals són difícils de dir. Fem una ullada a com podria semblar això en termes de codi Direct3D; Per fer-ho utilitzarem un exemple d’un altre lloc web fantàstic. RasterTek.

Aquí un sol triangle verd es presenta en mosaic en molts més triangles nadons.

El coronament es fa amb 3 ombres separades (vegeu la fig. mostra de codi): un ombrívol de vèrtex per configurar el triangle a punt per a la triangulació, un ombrívol del cos per crear el pegat i un ombrímetre de domini per representar noves cantonades. El resultat és molt senzill, però l’exemple d’Unigine posa de manifest els beneficis i els perills potencials de l’ús de mosaics a tot arreu. Tot i així, s’utilitza correctament i aquesta funció de representació de cantonades pot donar lloc a uns efectes visuals excel·lents, sobretot quan s’intenta simular col·lisions suaus del cos.

Podeu fer-hi front, capità!

Recordeu que els shaders de cantonades i sempre s’executen a cada racó de l’escena? No és difícil veure com la tessel·lació pot convertir aquest problema en un veritable problema. I hi ha molts efectes visuals que voleu abordar diverses versions de la mateixa primitiva, però que no voleu crear-ne un gran nombre al principi; el pèl, la pell, l'herba i les partícules que exploten en són bons exemples.

Afortunadament, hi ha un altre ombrejat disponible només per a aquest tipus de coses: ombrejat de geometria. És una versió més restrictiva del vèrtex ombrejat, però es pot aplicar a tot un principi i combinada amb la tessel·lació proporciona als programadors un major control sobre grans grups de vèrtexs.

Direct3D, com totes les API gràfiques modernes, permet una àmplia varietat de càlculs en punts de cantonada. Les dades finalitzades es poden enviar a la següent etapa del procés de creació (pixelació) o s’introdueix de nou a l’agrupació de memòria perquè la CPU la pugui tornar a treballar o llegir amb altres finalitats. Això es pot fer com un flux de dades com ressalta Microsoft Documentació Direct3D:

flux de sortida l'escena és particularment útil per a efectes amb moltes partícules a tot arreu, ja que pot retroalimentar tots els principis (no cantonades individuals) al bucle de representació. El mateix truc es pot canviar o dinàmic para-xocs de cantonada, però és millor mantenir estables els para-xocs d’entrada perquè hi ha un èxit de rendiment si cal que s’obrin per canviar.

La representació a les cantonades és una part fonamental de la representació, ja que determina com es disposa l’escena des de la perspectiva de la càmera. Els jocs moderns poden utilitzar milions de triangles per crear els seus mons, i cadascun d’aquests racons es transformarà i es cremarà d’alguna manera.

Manejar totes aquestes dades i matemàtiques pot semblar un malson logístic, però els processadors gràfics (GPU) i les API estan dissenyades tenint en compte tot això: representen una fàbrica en funcionament que dispara un article a través d’una sèrie d’etapes de producció i ho fa bé. ho entendràs.

Amb experiència Creació de jocs 3D els programadors tenen una base completa en matemàtiques i física avançades; Utilitzen tots els trucs i eines del comerç per optimitzar les transaccions i reduir la fase màxima de processament a uns pocs mil·lisegons. I això és només el començament de crear un marc 3D, després el pas de rasterització, i després hi ha una representació de píxels i textures força intricada abans que arribi a qualsevol lloc proper al monitor.

Ara que heu arribat al final d'aquest article, esperem que tingueu una visió més profunda del viatge d'un vèrtex quan es fabriqui per a un marc 3D. No ho vam cobrir tot (és un muazzam article!), i estem segurs que tindreu moltes preguntes sobre vectors, matrius, llums i elements primitius. Deixeu-los anar a la secció de comentaris i farem tot el possible per respondre-los a tots.

Llegiu també