博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
How to use the Custom Material node and create Metaballs 官方视频学习笔记
阅读量:6240 次
发布时间:2019-06-22

本文共 3073 字,大约阅读时间需要 10 分钟。

这个视频Youtube没有字幕着实蛋疼,本人英语很渣,几乎听不懂,里面有很多文档没讲的重要信息(文档讲的东西太少了)。

不过学习过后你可以解锁好几个姿势。这个视频主要是教你做DistanceField来写Shader,以下是最终效果:

一开始需要通过 r.ShaderDevelopmentMode 1,r.DumpShaderDebugInfo 1开启着色器开发模式(不过本人没感觉有什么用,可能到了用RHI写HLSL会比较有用)

为了方便之后的各位,本人在此贴上视频以及材质节点:

第一段代码:

float3 CamVec=normalize(WorldPos-View.ViewOrigin);float3 curpos=WorldPos;float3 normal=0;int maxsteps=16;float curdist,accum=0;float minstepsize=0.01;int i=0;while(i

  第二个CustomNode,于37:08贴出代码

//evaluate the distancefloat s1=distance(Sphere1.xyz,curpos)-Sphere1.w;float s2=distance(Sphere2.xyz,curpos)-Sphere2.w;float s3=distance(Sphere3.xyz,curpos)-Sphere3.w;float dot1=dot(normalize(curpos-Sphere1.xyz),float3(0.707,0.707,0))-1;float dot2=sin(dot1*2+(t*2))*1.5;dot2+=sin(dot1*24+(t*8))*0.07;s1-=dot2;float h=saturate(0.5+0.5*(s2-s1)/k);s2=lerp(s2,s1,h)-k*h*(1.0-h);h=saturate(0.5+0.5(s3-s2)/k);float curdf=lerp(s3,s2,h)-k*h(1.0-h);return curdf;

  33:20 查看HLSL代码中的 GetMaterialEmissiveRaw,发现这个函数写了连接到自发光上的所有节点信息,也就说把之前的节点都转化为代码了。

50:00为止的完整代码(之前的代码为了方便演示,把法线以为密度部分分离,以下是最后以后的代码):

//metaballs simplefloat3 CamVec=normalize(WorldPos-ViewOrigin);float3 curpos=WorldPos;float3 normal=0;int maxsteps=64;float curdist,accum=0;float minstepsize=0.01;int i=0;while(i

以下是最终的材质节点连线: 

 

 

 50:00之后演示了最终在Demo中用的部分代码(这个我没测试过):

float3 startpos=curposfloat3 accum=0;float3 normal=0;int i=0;	float curdist =CustomExpression2(Parameters,curpos,k,sphere1,sphere2,sphere3,sphere4.t);	accum-=curdist*TraceVec;	curpos-=TraceVec*curdist;		curdist=CustomExpression2(Parameters,curpos,k,sphere1,sphere2,sphere3,sphere4.t);	accum-=curdist*TraceVec;	curpos-=TraceVec*curdist;		curdist=CustomExpression2(Parameters,curpos,k,sphere1,sphere2,sphere3,sphere4.t);	accum-=curdist*TraceVec;	curpos-=TraceVec*curdist;	return startpos+accum;

  最后传入WorldPositionOffset,可以做出一个球体融合效果。

1:00:00 演示了获取各种屏幕属性

https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/FViewUniformShaderParameters/index.html

在CustomNode中输入View.ExposureScale;当然还有别的几个UniformShader条目,可以得到的属性还挺多。

1:08:50 Height to DF,一个高度图转Distance Field代码(也没测试过,图片用的是引擎里的,可以通过展开EngineContent搜索Texture找到):

heightratio=min(0.2,heightratio);float 2 texsize=0;float levels=0;Tex.GetDimensions(0,texsize.x,texsize.y,levels);texsize.x=min(texsize.x,256*s);texsize.y=min(texsize.y,256*s);float searchlength=max(texsize.x,texsize.y)*heightratio;float mindist=1;float3 startpos=float3(UV.x,UV.y,1);float3 sampledpos=0;for(int i=-searchlength;i<=searchlength;i++){	for(int j=-searchlength;j<=searchlength;j++)	{		sampledpos.xy=UV+float2(i,j)/texsize;		float texatray=Tex.SampleLevel(TexSampler,sampledpos.xy,0);		sampledpos.z=lerp(1,1-texatray,heightratio);		mindist=min(mindist,length(startpos-sampledpos));	}}return mindist/heightratio;

  

最后推荐了这个网站

http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
里面介绍了几个基本形状的距离计算公式

 

最终输出法线与ALPHA,存在XYZ与w通道中。法线用于从环境贴图中获得颜色信息,做出物体反射效果。

可惜英语不好,不然学起来会更快,所以我只能直接啃代码(第一段的抖动代码让我懵逼了很久),本人自己做了笔记,但是鉴于能力不足就不贴出来,怕误导大家,不过如果有不懂可以在此提问,我可以说一下我一些想法。

看完可以学会四个姿势:

1、距离场的简单计算(没看过距离场算法不好确认)
2、法线计算
3、距离融合算法
4、RayMarching

转载于:https://www.cnblogs.com/blueroses/p/6391995.html

你可能感兴趣的文章
Python MongoDB Spatial Query
查看>>
NetBeans IDE 7.4 Beta版本build JavaFX时生成的可执行jar包执行时找不到依赖的jar包
查看>>
笔记本wifi热点设置好后,手机连上但不能上网问题
查看>>
Run ASP.NET MVC site on mac (mono/xamarin studio)
查看>>
win8.1安装驱动出现“文件的哈希值不在指定的目录”的解决办法[zz]
查看>>
CRM 常用SQL 脚本
查看>>
备忘录--关于线程和IO知识
查看>>
【iCore3 双核心板】例程八:定时器PWM实验——呼吸灯
查看>>
jquery tmpl 详解
查看>>
docker学习笔记4:利用docker hub上的mysql镜像创建mysql容器
查看>>
【Xamarin开发 Android 系列 3】循序渐进的学习顺序
查看>>
自定义列表dl的使用原因和场合
查看>>
Oracle11G 卸载步骤
查看>>
PHP递归生成树形数组
查看>>
学习RSA公开密钥算法
查看>>
教你摆脱低级程序猿 项目中cocopads的安装使用
查看>>
禁止火狐浏览器缓存input标签方法
查看>>
[ilink32 Error] Error: Unresolved external '__fastcall Data::Win::Adodb::TCustomADODataSet
查看>>
.NET Core:面向未来的开源跨平台开发技术
查看>>
常用正则表达式
查看>>