Come raggiungere le normali condizioni di spazio tangenti?

Sto cercando di aggiungere funzionalità di bump mapping alla mia applicazione, ma sto ottenendo modelli molto sfaccettati:

inserisci la descrizione dell'immagine qui

La ragione per cui sta accadendo è perché sto calcolando tangente, binormale e normale per ogni faccia e completamente ignorando le normali che sto ottenendo dal file del modello.

Il calcolo utilizza attualmente due bordi del triangolo e i vettori dello spazio di trama per ottenere tangenti e binormali, che vengono quindi utilizzati per calcolare il prodotto normale mediante cross. Tutto viene eseguito sulla CPU non appena il modello viene caricato e i valori vengono quindi memorizzati come parte della geometria del modello.

vector1 = vertex2.coords - vertex1.coords; vector2 = vertex3.coords - vertex1.coords; tuVector = vertex2.texcoords - vertex1.texcoords; tvVector = vertex3.texcoords - vertex1.texcoords; float den = 1.0f / (tuVector.x * tvVector.y - tuVector.y * tvVector.x); tangent.x = (tvVector.y * vector1.x - tvVector.x * vector2.x) * den; tangent.y = (tvVector.y * vector1.y - tvVector.x * vector2.y) * den; tangent.z = (tvVector.y * vector1.z - tvVector.x * vector2.z) * den; binormal.x = (tuVector.x * vector2.x - tuVector.y * vector1.x) * den; binormal.y = (tuVector.x * vector2.y - tuVector.y * vector1.y) * den; binormal.z = (tuVector.x * vector2.z - tuVector.y * vector1.z) * den; D3DXVec3Normalize(&tangent, &tangent); D3DXVec3Normalize(&binormal, &binormal); D3DXVec3Cross(&normal, &tangent, &binormal); D3DXVec3Normalize(&normal, &normal); 

Esiste un modo per calcolare questi valori su base per vertice, magari usando il normale fornito con il modello o per renderli uniformi in qualche modo in modo che il modello non appaia sfaccettato?

Per superfici lisce (senza bordi) lo faccio in questo modo:

  1. crea spazio per per vertice

     double N[3]; //normal int cnt; 
  2. init per vertice

     N={0.0,0.0,0.0} cnt=0; 
  3. calcolare per faccia normale

    normale deve essere normalizzato length = 1.0 !!! aggiungi questa Normal a tutti i vertici usati in faccia e incrementa cnt a tutti i vertici usati in faccia

  4. per vertice normalizzare

     N/=cnt; // N = average normal from all vertex - neighbour faces 

    sii consapevole di cnt=0 per i vertici inutilizzati (divisione per zero)

  5. per vertice N contiene il normale che desideri

    ora computi T,B vettori T,B per la matrice TBN (per vertice) come fai ora

  6. l’immagine in uscita è liscia

    La mia anteprima terrestre (con scattering atmosferico, bump mapping e altro …) è qui

spero che sia d’aiuto