Fresnel имеет спад отражающегося мира в центре сферы на обычном пластике или не металле.
Но на металле окружающий мир отражается четко и равномерно.
Как на этой картинке.
И вот вопрос как Fresnel сложить с металлом в PBR шейдере ?
кукиторинз?
ronniko
нужно для металла задать соответствующий ior (20-100)
Вопрос задан слишком обобщенно.
А. Тебе нужно в готовом шейдере это сделать? Если да, то какой движок?
Б. Тебе нужен пример псевдокода? Если да, давай пример кода своего шейдера, что бы можно было прикинуть что к нему можно добавить, для получения нужного результата.
trash metal, death metal, frensel metal
Сложить с металлом?
vec3 F0 = mix(vec3(0.04), diffuse_coeff.rgb, metalness); diffuse.rgb = mix(diffuse_coeff.rgb, vec3(0.0), metalness); vec3 fresnel = F0 + (vec3(1.0) - F0) * pow(1.0 - clamp(dot(V, N), 0.0, 1.0), 5.0); specular.rgb = fresnel; diffuse.rgb *= vec3(1.0)-fresnel;
ronniko
> Fresnel имеет спад отражающегося мира в центре сферы на обычном пластике или не
> металле.
Он же вроде не до нуля падает, а зависит от микрорельефа. Разве нет?
MrOcelot
vec3 F0 = mix(vec3(0.04), diffuse_coeff.rgb, metalness);
Вот это похоже на то что мне надо.
Это походу IOR.
vec3 F0 = mix(vec3(0.04), diffuse.xyz, METALLIC);
vec3 F = F0 + (max(vec3(1.0 - ROUGHNESS), F0) - F0) * pow(1.0 - dot(n, v), 5.0);
diffuse.xyz *= textureLod(sEnvmap, n, MAX_LOD).xyz;
vec3 specular = textureLod(sEnvmap, r, ROUGHNESS * MAX_LOD).xyz;
vec2 lut = texture2D(sLUT, vec2(max(0.0, dot(n, v)), ROUGHNESS)).xy;
specular = specular * (F * lut.x + lut.y);
vec3 kd = (vec3(1.0) - F) * (1.0 - METALLIC);
vec3 color = kd * diffuse.xyz + specular;
gl_fragColor = vec4(color, diffuse.w);
что-то такое
ronniko
0.04 это константный F0 для диэлектриков
Из IOR считается как-то так:
vec3 F0 = abs((1 - IOR)/(1 + IOR)); F0 *= F0;
С учетом этого код станет таким:
vec3 F0 = vec3(abs((1.0 - IOR)/(1.0 + IOR))); F0 *= F0; F0 = mix(F0, diffuse_coeff.rgb, metalness); diffuse.rgb = mix(diffuse_coeff.rgb, vec3(0.0), metalness); vec3 fresnel = F0 + (vec3(1.0) - F0) * pow(1.0 - clamp(dot(V, N), 0.0, 1.0), 5.0); specular.rgb = fresnel; diffuse.rgb *= vec3(1.0)-fresnel;
Список IOR для различных материалов можно найти здесь:
https://pixelandpoly.com/ior.html
lookid и MrOcelot спасибо за интересную информацию и за помощь.
Misanthrope спасибо за музыку frensel metal :)
Тема в архиве.