Blender2.7中合并纹理图集
在游戏开发与设计过程中,可以对模型资源本身进行很多优化操作。
比如对纹理进行压缩,预计算MinMap;比如高模烘培低模材质;比如简化模型;比如合并网格;比如合并纹理图集。
这篇文章记录如何使用Blender2.7版本进行合并纹理创建纹理图集,由于Blender2.8之后进行了大改,所以这篇文章只适合2.7以及之前的版本。
blender2.7,2.8的场景变换操作和快捷键跟JMonkeySDK一致(G键开启平移,R键开启旋转,S键开启缩放,按下G再按下X,Y,Z其中一个,可以只在指定轴进行平移,同理缩放和旋转,按Esc可以立即撤销并退出操作),所以可以很快上手。
打开obj模型,如下:
一些调整,我们按S键(可以按住Shift键和鼠标拖动来细节调整缩放,否则可能缩放速度过快),然后缩放模型到合适位置,如下:
接着,我们按A全选,按Tab进入编辑模型模式,然后在编辑模型模式下按P,选择按材质分离(默认导入obj会把所有对象集成到一个节点中,我们需要先按材质分离渲染实例),然后按Tab返回模型布局模式(这里这个obj以及提前分离过了,可以看到场景树那里有很多节点):
在布局模式下,按鼠标右键可以选择选中节点,我们选择棍棒节点,然后按Tab快速切换到编辑模式,然后再拖出一个UV/图像编辑器窗口(只有按Tab进入编辑模式,UV/图像编辑器才会出现UV布局),如下:
接着我们转入物体数据面板,创建一个新的UV,命名为GroltUV,如下:
然后,我们新的UV(也就是GroltUV),我们让这个UV映射到一个新图像纹理,而不是GroltClub.dds(这个是默认的棍棒的UVMap映射的纹理)。我们在UV/图像编辑器->图像->新建图像,名为GroltAltTexture,然后保存纹理,如下:
(最好1024,因为我们需要合并3个纹理到这个图集中,所以可以确保高一点的分辨率)
这个时候你会发现当前的GroltUV映射到了GroltAltTexture这个纹理。然后我们在UV/图像编辑器中,按A全选,然后按S进行缩放,调整棍棒UV,然后按G进行平移,放到这个图集(GroltAltTexture)的某个位置,如下:
接着,我们需要保证棍棒先绑定默认的UVMap,如下:
然后进入渲染面板,由于这是图集的第一次渲染,所以我们可以勾选清楚数据,然后选择烘培类型为纹理,边距5像素,然后勾选活动物体到指定物体,最后点击烘培,如下:
数据以及烘培到了图集上。
接着,我们进入物体数据面板,将棍棒绑定到GroltUV,如下:
然后,进入材质面板,由于这里使用的是Phong光照材质参数,可以看到有Ka和Kd,其实就是Phong光照中的ambient和diffuse,我们点击Ka,然后图像那里选择我们的纹理:
同理,我们再点击Kd(漫反射),也把图像选择我们的GroltAltTexture.png。
这里演示了将ambient和diffuse都设置为同一个纹理,但实际上我们可以烘培不同的纹理做不同的参数。
然后从编辑模式返回布局模式,选择身体部分。
同样的,按Tab进入编辑模式,然后在物体数据面板创建一个新的UVMap,名为GroltUV(随便命名,不必和棍棒的那个一致),然后,注意,我们不需要为该GroltUV创建新的映射纹理图像,而是直接选择我们之前的那个生成的GroltUV映射的那张GroltAltTexture.png作为身体的这个GroltUV要映射的纹理图像即可。如下:
然后,我们可以验证下,鼠标选中UVMap时,是这样的:
然后选中GroltUV时,是这样的:
说明一切正常,我们将GroltUV映射为GroltAltTexture.png。接下来我们在UV/图像编辑器中,按A全选,然后按S进行缩放,并按G进行平移,把身体部分移到纹理图集的还没有被写入像素的部分区域,如下:
然后,进入渲染面板,这一次,取消“清楚”勾选,因为我们需要保留棍棒的数据。然后其他参数跟棍棒的设置一致,点击烘焙,如下:
然后,我们按照之前的操作,将身体部分的UV设置为GroltUV,然后纹理面板设置为GroltAltTexture.png等等即可。
最后,对面部部分进行同样的操作,然后就完成了纹理图集(然后可以选择其中一个节点,比如选择面部,然后再选择身体和棍棒,按Ctrl+J,合并为一个节点Mesh,当然,不合并也可以,三个节点使用同一个材质,可以在JMESDK中进行合并batch),如下:
需要注意的一点是,一旦更新了GroltAltTexture(即每次烘焙新数据到GroltAltTexture中)时,我们必须保存该图像,否则会有*号存在,如下:
同时,我们的目录下的GroltAltTexure是这样的:
因为我们的数据只保存在blender内存中,最后一次实际保存到磁盘中的是棍棒那一次保存,后面两次烘焙都没有保存最新结果到磁盘中,所以磁盘中的.png才不是最新的,我们保存最新结果,然后磁盘的图像如下:
这里我重命名了为GroltAltTexture.png了,上面那个是写文章时名称命名错了。
确保所有节点应用了新的UVMap,纹理设置了新的GroltAltTexture.png后(还可以选择把所有节点合并到一起,因为现在所有节点使用同一个材质了,所以完全可以合成一个Mesh),我们重新导出为.obj。
然后打开jMonkeySDK(3.3.2,我使用的版本),然后导入模型后,如下:
基本一致。