Preface / 前言
Normal Map / 法线贴图
主要是 3D
游戏中的概念。最近在 Editor
移植 Unity3D
的一些特效组件时,碰到了一些 Normal Map
相关的技术。
本人虽然对 3D
游戏开发一窍不通,但是想起早些年看过在 2D
中用 Normal Map
来模拟一些光照效果的例子,于是就想在自己写的编辑器中尝试看看。
Generate Normal Map / 生成法线贴图
既然是要用到 Normal Map
那么肯定要先想办法生成一张来用一下。
首推的当然是 SpriteIlluminator - Normalmap Editor for 2d Dynamic Lighting 这个软件,很多年前 cocos2d-x
时代就看过 教程。
用法什么的都很直观,工具也很强大,还可以实时的预览,当然这个是收费软件。
除了上面这个,还有下面这个也很不错,免费的在线网站,可以简单的生成 Normal Map
: NormalMap-Online
Normal Map in Shader / Shader 法线贴图
这里参考的是上面 sprite illuminator
教程中,提到的 PointLight / 点光源
的 shader
的实现方法: pointlight.frag
这里重要的步骤,主要是:
-
从
Normal Map
中提取法线信息:vec3 normal=texture2D(u_normals, v_texCoord).rgb; normal=normal*2.0-1.0;
-
再根据光源位置进一步计算:
float normDotPosToLight=max(0.0,dot(normal,posToLight));
-
将光照反射的颜色混入最终结果:
vec3 diffuse = normDotPosToLight * u_brightness * u_lightColor; gl_FragColor = vec4(texColor.rgb * diffuse, texColor.a);
注意上面的步骤去掉了很多细节计算,只是一个简化的,大概的过程。
Normal Map in Editor / 编辑器 法线贴图
知道了原理,也有了素材,那就可以在编辑器中尝试一下了:
这里只是大概的简单实现了一下使用 Normal Map
的光照效果。后面会考虑在编辑器中提供更方便的 Premade
的组件,让用户只需要简单的提供 Normap Map
和 光源
相关的信息,就可以方便的使用这一效果。
另外,特效如果配合一些 LoS
的视线效果也会非常的不错,这个有兴趣的可以参考我以前发过的帖子:
关于编辑器,可以看这里: