Insider Insider
3dnchu 尚无浏览 2 分钟阅读

Blob with Raymarching – 在UE4上使用光线步进构建Blob着色器的教程视频!非常适合入门!

由Epic Games的技术美术Marien Elalaoui制作,使用自定义节点和HLSL着色器,在UE4上构建使用光线步进着色器的Blob表现的教程《Blob with Raymarching》已在Youtube上公开。

虽然是英文,但会一边逐步构建一边讲解,所以即使只是照着一步一步操作,也会很有学习价值。

视频中出现的Distance函数参考网站:Inigo Quilez :: fractals, computer graphics, mathematics, shaders, demoscene and more

我也能轻松做到!

我把着色器代码和节点图片参考也贴在这里。

自定义节点内容

#include "/Engine/RMBlob.ush"
return 0;

只是读取保存在UE主体安装路径中的Engine/Shaders文件夹里的着色器而已

RMBlob.ush的内容

struct RMstruct
{

float RMSphere(float3 pos)
	{
		return length(pos) - 50;
	}
	
	float3 RMNormal(float3 pos)
	
	{
	float2 Off = float2(0.01,0);
	return normalize(float3(
	RMSphere(pos + Off.xyy) - RMSphere(pos - Off.xyy),
	RMSphere(pos + Off.yxy) - RMSphere(pos - Off.yxy),
	RMSphere(pos + Off.yyx) - RMSphere(pos - Off.yyx)
	));
	}

	//Smooth Union
	float opSmoothUnion( float d1, float d2, float k ) 
	{
		float h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 );
		return lerp( d2, d1, h ) - k*h*(1.0-h); 
	}

};

RMstruct RM;
float4 Col = 0;
float3 pos = WorldPosition;
float3 Normal = 0;

for(int i=0; i<MaxSteps; i++)
{
	if(SceneDepth < length(pos - CameraPosition))
	break;
	
	float d1 = RM.RMSphere(pos - ObjectPosition);
	//不使用网格距离场时(已注释
	//float d2 = SceneDepth - length(pos - CameraPosition);
	//使用网格距离场时
	float d2 = GetDistanceToNearestSurfaceGlobal(pos);

	float distance = RM.opSmoothUnion(d1, d2, Smooth);
	
	if(distance < 0.01)
	{
		Col = 1;
		Normal = RM.RMNormal(pos - ObjectPosition);
		break;
	}
	pos += CameraVector * 1;
}
return float4(Normal,Col.a);

材质节点参考

据说这次是Marien Elalaoui氏的第一个教程视频,
但我对他过去上传的视频表现非常感兴趣。今后的动向也很令人期待呢。

链接

ArtStation – Marien Elalaoui