How to use the Custom Material node and create Metaballs 官方视频学习笔记

这个视频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<maxsteps)
{
	curdist=CustomExpression0(Parameters,curpos,k,Spere1,Spere2,Spere3,t);
	if(curdist<thresh)
	{
		return float4(1.0,1.0,1.0,1.0);
	}
	curpos+=CamVec*max(minstepsize,curdist);
	minstepsize+=0.02;
	i++;
}
return 0;

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

//evaluate the distance
float 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 simple
float3 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<maxsteps)
{
	curdist=CustomExpression0(Parameters,curpos,k,Sphere1,Sphere2,Sphere3,t);
	if(curdist<thresh)
	{

		curpos+=CamVec*curdist;
		normal.x=CustomExpression0(Parameters,curpos+float3(1,0,0)*o,k,Sphere1,Sphere2,Sphere3,t);
		normal.y=CustomExpression0(Parameters,curpos+float3(0,1,0)*o,k,Sphere1,Sphere2,Sphere3,t);
		normal.z=CustomExpression0(Parameters,curpos+float3(0,0,1)*o,k,Sphere1,Sphere2,Sphere3,t);
		normal=normalize(normal);
		CamVec=lerp(CamVec,-normal,Refraction);

		int j=0;
		while(j<16)
		{
			curdist=CustomExpression0(Parameters,curpos,k,Sphere1,Sphere2,Sphere3,t);
			if(curdist<ShadowMult)
			{
				curdist=max(0,curdist);
				accum+=ShadowMult-curdist;
			}
			curpos+=CamVec*10;
			j++;
		}
		return float4(normal,accum);
	}
	curpos+=CamVec*max(minstepsize,curdist);
	minstepsize+=0.02;
	i++;
}
return 0;

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

 

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

float3 startpos=curpos
float3 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
里面介绍了几个基本形状的距离计算公式

时间: 2024-10-25 18:49:19

How to use the Custom Material node and create Metaballs 官方视频学习笔记的相关文章

node.js在windows下的学习笔记(2)---简单熟悉一些命令

1.打开如下的安装 2.输入node -v,显示node的版本号 3.输入node --help.显示帮助命令 4.自己用一个文本编辑器编写一下代码,保存为text.js,然后在控制台输入node.exe  text.js的路径(直接把这个js文件拖到控制台自动显示路径),按下回车键 var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {&

node.js在windows下的学习笔记(1)---安装node.js

1.首先打开http://www.nodejs.org/ 2.选择DOWNLOADS,跳转到下面的画面,我的系统是windows7的32位.所以选择.msi的32bit版本. 3.下载后,得到一个5.43MB大小的安装包, 4.运行安装包 点击next 打个勾,点击next 选择安装目录 最后,安装成功啦 node.js在windows下的学习笔记(1)---安装node.js,布布扣,bubuko.com

node.js在windows下的学习笔记(5)---用NODE.JS创建服务器和客户端

//引入http模块 var http = require('http'); //调用http的createServer的方法,这个方法有一个回调函数,这个回调数 //的作用是没到那个有请求发送给服务器的时候,就执行这个回调函数 http.createServer(function (req, res) { //发送 res.end('Hello World\n'); }).listen(3000, "127.0.0.1");//端口和IP的绑定 console.log('Server

node.js在windows下的学习笔记(4)---同步,异步,回调的概念

Node.js是使用事件驱动的,非阻塞的I/O模型,用于构建快速的,可扩展的网络应用程序. Node.js想解决的问题是:处理输入,输入,高并发 1.阻塞与非阻塞 阻塞也叫同步,是指每一次执行一个操作,在这个操作完成之前,代码的执行会被阻塞,无法移到下一个操作上. 阻塞就相当于你在超市里面买东西,结账,在排队,如果前面的人没买单,你就不能买,一定要等前面的人先执行完其操作才可以 非阻塞就相当于你在外婆家取号,然后就可以去干别的事情了,等轮到我们的时候,短信发到我们的手机上了,说轮到我们了,这样我

node.js在windows下的学习笔记(7)---express的app.js的详细配置说明

var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var routes = require('./routes

node.js在windows下的学习笔记(3)---npm

1.什么是npm npm是Node.js的包管理器,它允许开发人员在Node.js的应用程序中创建,共享,重用模块.之前我们通过node的官网的安装程序安装了Node.js,那么npm就已经装好了的. 既然npm是Node.js的包管理器,那么什么是包呢? 包:包是一个文件夹,将模块封装起来,用于发布,更新,依赖管理,版本控制.你可以简单的把包理解成就是一个文件夹.package.json描述包的一些信息 模块:一个实现某些特定功能的文件,以实现模块化编程. 2.如何使用npm为node.js安

node.js在windows下的学习笔记(8)---进程管理Process

process是一个全局内置对象,可以在代码中的任何位置访问此对象,这个对象代表我们的node.js代码宿主的操作系统进程对象. 使用process对象可以截获进程的异常.退出等事件,也可以获取进程的当前目录.环境变量.内存占用等信息,还可以执行进程退出.工作目录切换等操作 1.当我们想要查看应用程序当前目录时,可以使用cwd函数 : process.cwd(); 2.如果需要改变应用程序目录,就要使用chdir函数了: process.chdir('目录名'); 3.stdout是标准输出流,

node.js在windows下的学习笔记(6)---安装Express

Express是什么呢? express.js是nodejs的一个MVC开发框架,并且支持jade等多种模板.对于WEB应用程序而言,会有许多诸如模板和路由这样的公共模式在的,虽然也可以自己编写代码解决这些问题,但是很多的开发者会选择如Express这样的框架来避免这样的工作,并且对之有所贡献 1.安装express,命令是:npm install -g express,这里-g表示Express将是全局安装的,可以在系统的任何地方使用其命令 2.安装express命令工具,命令是:npm in

Node.js笔记(0003)---Express框架Router模块学习笔记

这段时间一直有在看Express框架的API,最近刚看到Router,以下是我认为需要注意的地方: Router模块中有一个param方法,刚开始看得有点模糊,官网大概是这么描述的: Map logic to route parameters. 大概意思就是路由参数的映射逻辑 这个可能一时半会也不明白其作用,尤其是不知道get和param的执行顺序 再看看源码里面的介绍: Map the given param placeholder `name`(s) to the given callbac