Ombreggiatura non così liscia
Domanda
Shading Blinn-Phong ...?
Quindi il problema che sto avendo, come illustra la suddetta immagine, è che non riesco a sembrare che i miei punti salienti speculari abbiano ombra senza intoppi. Il problema è il cuoio brusco lungo i bordi del viso, che non dovrebbe accadere. L'illuminazione diffusa sembra funzionare abbastanza bene, e utilizza gli stessi valori interpolati. Ecco il codice per i punti salienti Blinn-Phong Phong:
vec3 halfAngle = normalize(lightDirection.xyz + viewRay);
float blinnTerm = dot(normal.xyz, halfAngle);
blinnTerm = clamp(blinnTerm, 0.0f, 1.0f);
blinnTerm = pow(blinnTerm, 300.0f);
float specIntensity = intensity * blinnTerm;
vec4 specColour = specIntensity * specColour;
.
lightDirection
è costante, è infinitamente lontano (cioè il sole). Per quanto riguarda Viewray, è calcolato nel vertice shader come così, utilizzando la matrice di proiezione:
viewRay = vec3(-(UV.x * 2.0f - 1.0f) / projection[0].x,
-(UV.y * 2.0f - 1.0f) / projection[1].y,
1.0f);
.
Sto usando il rendering differito, che è il punto in cui provengono i valori UV (rendering a una trama a schermo intero).
L'unica cosa che riesco a pensare è che la normale interpolazione non è abbastanza liscia. Ma se è così, come dovrei aggiustarlo? (Sto memorizzando le normali come galleggianti a 16 bit, ma sporgendo a 32 bit non hanno fatto la differenza).
Soluzione
E la teiera è ora risolta!Lì era un problema con interpolazione delle normali, ma per fortuna è stata una soluzione facile;Stavo normalizzando le normali nel mio shader Vertex, quindi interpolando, piuttosto che interpolando prima e poi normalizzare.Non è ancora perfetto, ma è certamente un miglioramento!
La lezione qui: Se la tua immagine sembra piatta, probabilmente stai facendo qualcosa che non dovresti fare nel vertice shader.