Articles et discussions techniques > Code

Je fait encore du desktop, rendu PBR wannabe

(1/2) > >>

ponce:
Salut, j'avais oublié d'annoncer ça sur DFR. Je me suis lancé dans le plugin audio depuis 10 mois.

C'est en rapport avec ce forum car j'ai un peu trippé, mon framework (https://github.com/p0nce/dplug) fait du rendu "PBR" pour l'UI sur CPU:
- j'ai une map de profondeur (important qu'elle soit >= 16-bit)
- une map diffuse RGB + emissiveness
- un channel roughness => exposant spéculaire entre autres
- un channel metalness => quantité d'envmap
- un channel specular => quantité de spéculaire
- un channel physicalness => permet de bypasser et prendre le RGB direct pour tricher
En vérité j'arrive pas trop à simuler énormément de matériaux et il faut texturer dans la map de diffuse, mais bon :)

En dernier lieu je corrige les couleurs avec un look-up lift-gamma-gain ça évite d'avoir à ajuster tout le reste.   :P

Avec pas trop de travail on peut avoir des interfaces comme ceci ou les boutons bougent et les ombres suivent, ce qui est quand même bien normal.




C'est le produit que j'ai sorti en novembre (octaveur pour voix assez unique, ça fait du vocal fry avec zéro latence).

Patapom:
Joli ! :D

(Graillon il s'appelle ton truc ?? ;D )

Patapom:
Il sert à quoi ton canal specular si tu as déjà un channel "métal" ?? Le métal te sers pas à utiliser la diffuse soit pour l'albédo, soit pour la réflectance spéculaire ?

Patapom:
Bah oui, les métaux n'ont pas de diffuse...
Un exemple de ce qu'ils font dans Marmoset Toolbag, Unreal et que j'utilise aussi:


--- Code: ---float3  diffuseColor = diffuseTex.Sample( ... );
float    metal = metalTex.Sample( ... );

float3  diffuseAlbedo = lerp( diffuse, 0, metal );   // Plus on est métallique, plus la diffuse passe à 0
float3  specularF0 = lerp( 0.04, diffuse, metal );  // En diélectrique, on a F0=0.04, en conducteur on a F0=diffuse

--- End code ---

F0 c'est ta réflectance spéculaire quand ton angle d'incidence est à 0° (orthogonal à ta surface).
A partir de ça tu peux en déduire l'index de réfraction de ta surface en faisant :


--- Code: ---// Assuming n1=1 (air) we get:
// F0 = ((n2 - n1) / (n2 + n1))²
// => n2 = (1 + sqrt(F0)) / (1 - sqrt(F0))
//
float3 Fresnel_IORFromF0( float3 _F0 ) {
float3 SqrtF0 = sqrt( _F0 );
return (1.0 + SqrtF0) / (1.00001 - SqrtF0);
}

--- End code ---

Tu vois que la valeur magique 0.04 correspond à un IOR de 1.5 qui est à peu près standard pour les diélectriques, on voit également que comme c'est un scalaire (ou un float3( 0.04, 0.04, 0.04 )), les reflets spéculaires des diélectriques sont monochromes.
Le fait qu'on utilise la texture diffuse comme F0 de spéculaire permet de faire des reflets spéculaires colorés sur les métaux.

J'ai pas regardé ton code en détail mais tu as de chouettes résultats avec de toute manière, c'est pas trop la peine de le changer ! :D

MooZ:
Hey ponce!

Joli rendu et je rejoins Patapom. Même si ta technique n'est pas super physiquement correct, si le rendu est cool, que les perfs sont correctes et que tu ne passes pas 3 plombes à ajuster les paramètres et les textures, ça ne vaut peut être pas le coup de tout refaire.

Navigation

[0] Message Index

[#] Next page

Go to full version