背景
最近需要展示一些网格模型,受fb_help大佬的指点,发现meshlab支持phong渲染,相比默认的渲染结果,可以得到更加漂亮的渲染图。
下图展示了分别用默认渲染结果和phong渲染结果,不难发现右图看起来舒服多了。
phong渲染模型
转载自:https://learnopengl-cn.github.io/02%20Lighting/02%20Basic%20Lighting/
phong渲染模型包括由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子。环境光是场景的基本亮度,主要指离当前场景比较远的光源;漫反射很好理解了,如果物体表面不是完整光滑的,光线应该朝多个方向传播;但是通常物体应该介于光滑和粗糙之间,所以还要考虑一点镜面反射。
具体的数学公式请参考转载链接。
操作
额外提示,shift+alt+鼠标左键 可以 调节光线方向。
1. phong渲染
2. depth渲染
3. normal渲染
normal渲染前参考https://stackoverflow.com/questions/45869953/meshlab-normalmap修改一下渲染方式,具体原理我也暂时不懂~~~
修改的文件的具体路径在meshlab的安装目录/shaders/
下。
normalmap.frag
//uniform sampler2D bump;
//uniform float Kd;
//uniform float Ks;
//uniform float Ke;
varying vec4 baseColor;
//varying vec3 ViewDirection;
//varying vec3 LightDirection;
void main(void)
{
//vec3 bumpPert = normalize( -(0.5,0.5,0.5) + texture2D(bump, gl_TexCoord[0].st).rgb );
//vec3 LightDir = normalize(LightDirection);
//vec3 ViewDir = normalize(ViewDirection);
//vec3 nNormal = normalize(gl_NormalMatrix * bumpPert);
//float diffuse = clamp(dot(LightDir, nNormal), 0.0, 1.0);
//float specular = pow(clamp(dot(reflect(ViewDir, nNormal),-LightDir),0.0, 1.0), Ke);
//gl_FragColor = (Kd * diffuse * baseColor) + (Ks * specular)*baseColor;
gl_FragColor = baseColor;
}
normalmap.vert
//varying vec3 ViewDirection;
//varying vec3 LightDirection;
varying vec4 baseColor;
void main(void)
{
//gl_Position = ftransform();
//gl_TexCoord[0] = gl_MultiTexCoord0;
//ViewDirection = -vec3(gl_ModelViewMatrix * gl_Vertex);
//LightDirection = gl_LightSource[0].position.xyz;
//baseColor = gl_Color;
gl_Position = ftransform();
baseColor = vec4(gl_Normal, 1.0);
}
---------------------
作者:yanqs_whu
来源:CSDN
原文:https://blog.csdn.net/u012348774/article/details/110532039
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件