Unreal Engine 4 —— Marching Cube算法的实现与思考
这篇博客介绍了我在Unreal Engine 4中通过Marching Cube算法来构建隐式曲面模型的过程,以及我的一些思考。
背景
前面的博客游戏《孢子》的思考 —— Marching Cube算法提到了Marching Cube的大致思路,剩下的就是如何在UE4中将其实现了。因此花了一天的时间将其在UE4中实现了一下。
效果图
以下效果图中,蓝色部分是使用Debug Draw方法绘制的三角形边。
这是球形曲面方程
这是曲面方程
这是曲面方程
这是细分程度为20的图:
依然存在的问题
以什么方式绘制顶点?
目前的做法是在Gameplay逻辑中运行Marching Cube算法,然后将得到的Density,Normal,Position信息传递到SceneProxy里面,然后在SceneProxy里面创建顶点并且绘制。
但是应该有更加高效的做法……
UV怎么处理?
一个很蛋疼的问题在于UV —— 该怎样生成一个比较合适的UV,从而获得一个比较好的效果?
在GPU Gems 3里面提到过类似的情况,不过是用于做地形的,并不普适。
在Stackoverflow上面有人提到过直接使用Enviroment mapping,就是在获得了Normal之后,直接通过(x/2+0.5, y/2+0.5)
来作为uv。目前还没尝试过,不过可以试试看。
切线空间怎么构建?
因为UE4的渲染管线无法自定义,因此想要实现Gouraud Shading还是比较难的,这也就是上面的模型的光影看起来很奇怪的原因。
工具链怎么适配?
我原本想使用BlueprintNativeEvent作为曲面方程的函数,默认为一个圆曲面,用户可以重写对应的曲面方程。但是这种做法只针对于那些可以由BP继承的Component有效。由于这里继承自Mesh Component,因此无法进行由蓝图继承。
按这么说……看来只能使用Blueprint Interface来进行操作了?
Wireframe为啥显示不出来?
这条划掉,切线空间建立后就显示出来了…… 很奇怪的,在Lit Mode与Unlit Mode下都可以显示,但是切换到Wireframe模式下,就显示不出来了……这一步需要进一步研究……
<全文完>