开启辅助访问
切换到窄版
登录
立即注册
只需一步,快速开始
社区
BBS
找回密码
站务合作
搜索
搜索
在线大礼包
每日签到
本版
用户
引擎世界丨EngineWorld.CN
»
社区
›
UnrealEngine 4 专区
›
UE4 美术交流
›
Unreal浅做一个MetaBall
返回列表
发新帖
[环境]
Unreal浅做一个MetaBall
[复制链接]
1552
|
0
|
2023-3-6 12:18:49
|
显示全部楼层
|
阅读模式
Hello,大家好,今天是raycharching的初学,我是木偶心没。
Raymaching其实就是实时场景的一种渲染方法。主要原理网上有很多详细介绍,简单来说就是,以摄像机为原点,发射很多条射线,而每一条射线以步长为单位向前采样,同时以采样点和最近的物体像素的距离为半径进行一个球形检测。检测到摄像机和场景像素在当前射线方向的距离差小于某个值,就表示射线到达物体表面,然后画这个像素。
开始在
unreal
里面进行简单的实现
首先上才艺
图片仅供参考,具体以实物为准
1、custom节点算出球体
先上代码
float distance = length(pos-ObjectPosition)-50;
减去50表示小球的半径
2、去掉被遮挡的部分
为了对算法进行优化,我们可以去掉球体被遮挡的部分,比如说地面以下的部分。
判断场景深度是否小于摄像机到物体像素的距离,小球处于地面以下后,深度值就会取平面的深度值,所以如果深度值小于摄像机到像素距离的话,不进行检测。
3、添加法线
求法线就简单粗暴的对检测结果求一个梯度变化,设定一个值,求在这个值前后的检测结果的插值。最后把normal的信息也输出出来。具体结果如下
注意材质球的normal要取消勾选targent space normal,因为算出来的是一个世界法线
4、跟地面的融合效果
参考文档
https://iquilezles.org/articles/distfunctions/
,里面有很多算形状等基本运算的公式代码,以及详细推导
关于这个公式的详细算法推导链接如下
https://iquilezles.org/articles/smin/
主要就是一个分段函数,d1是检测出来的小球,d2是与其相交的一个物体的距离场,k表示两个相交的物体在相交那部分的一个过渡值,即达到这个值开始相交。
所以d1 = RM.RMSphere(pos-ObjectPosition);
而d2,这里用深度代替距离场,就等于射线方向上那个物体对应的场景深度减去摄像机到小球像素的距离
float d2 = SceneDepth - length(pos - CameraPosition);
这里混合d1和d2用lerp。
最终效果
调整采样步数等可以解决边缘锯齿,但是性能计算会更大,目前还没有找到一个更好的解决办法。
回复
使用道具
举报
提升卡
变色卡
千斤顶
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
星仔亮晶晶
37
主题
10
回帖
257
积分
初阶编码师
初阶编码师, 积分 257, 距离下一级还需 743 积分
初阶编码师, 积分 257, 距离下一级还需 743 积分
积分
257
加好友
发消息
回复楼主
返回列表
UE4 素材资源分享
UE4 美术交流
UE4 编程开发
UE4 VR/移动开发
UE4 编辑器使用
UE4 教学资料
UE4 综合问答