/ / Ombre non così lisce - opengl, glsl, luci, normali, speculari

Ombreggiatura non così liscia - opengl, glsl, illuminazione, normali, speculare

Ombreggiatura Blinn-phong ...?

normali Blinn-Phong

Quindi il problema che sto avendo, come l'immagine soprasi spera che illustri, è che non riesco a ottenere i miei riflessi speculari per ombreggiare dolcemente.Il problema è il taglio brusco lungo i bordi del viso, che non dovrebbe succedere. L'illuminazione diffusa sembra funzionare abbastanza bene e utilizza gli stessi valori interpolati. Ecco il codice per i punti salienti speculari blinn-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 nello shader del vertice in questo modo, usando 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, da cui provengono i valori UV (rendering su una trama a schermo intero).

L'unica cosa che riesco a pensare è quella normalel'interpolazione non è abbastanza liscia, ma se è così, come farei per risolverlo? (Sto memorizzando le normali come float a 16 bit, ma il fatto di aumentarle a 32 bit non ha fatto la differenza).

risposte:

2 per risposta № 1

inserisci la descrizione dell'immagine qui

E la teiera ora è riparata! Là era un problema con l'interpolazione delle normali, maper fortuna era una soluzione facile; Stavo normalizzando le normali nel mio vertex shader, quindi interpolando, piuttosto che interpolare prima e poi normalizzare. Non è ancora perfetto, ma è certamente un miglioramento!

La lezione qui: se la tua immagine sembra piatta, stai probabilmente facendo qualcosa che non dovresti fare nel vertex shader.