ShaderToy转UE HLSL (更新中)

Overview:

本文前10例主要选取并优化了Youtube上RenderBucket频道的HLSL基础案例,后10例主要选取Shadertoy上的GLSL并转换为UE的自定义节点中的HLSL

Process:

本文创建于2025年6.22日,截至7.24日 目前更新完15例。预计更新到20例,并添加一些自制常用Material Function。


自动转换

https://github.com/smkplus/ShaderMan

手动转换

1.高频转换内容

GLSL HLSL (Unreal) 说明
mix(a,b,t) lerp(a,b,t) 插值
fract(x) frac(x) 小数部分
atan(y,x) atan2(y,x) 角度函数
fragCoord, iResolution UV, View.WorldPosition 坐标获取
vec4, vec3, float float4, float3, float 返回值类型

2.数据类型对照

GLSL HLSL 说明
float float 浮点数
vec2 float2 2D 向量
vec3 float3 3D 向量
vec4 float4 4D 向量
mat3 float3x3 3×3 矩阵
mat4 float4x4 4×4 矩阵
int int 整数
bool bool 布尔值

3.其它函数对照

GLSL 函数 HLSL 对应函数 说明
mod(a, b) fmod(a, b) 取模
normalize(v) normalize(v) 单位向量
length(v) length(v) 向量长度
dot(a, b) dot(a, b) 点乘
cross(a, b) cross(a, b) 叉乘
clamp(x,a,b) clamp(x,a,b) 限制范围
step(e, x) step(e, x) 阶跃函数(条件判断)
smoothstep(a,b,x) smoothstep(a,b,x) 平滑插值
sin(x) sin(x) 正弦
cos(x) cos(x) 余弦
tan(x) tan(x) 正切
abs(x) abs(x) 绝对值
sign(x) sign(x) 符号(正1/负1/0)
floor(x) floor(x) 向下取整
ceil(x) ceil(x) 向上取整
pow(x,y) pow(x,y) 幂函数
exp(x) exp(x) e^x
log(x) log(x) 自然对数
min(a,b) min(a,b) 最小值
max(a,b) max(a,b)

最大值

mod(a,b) fmod(a,b)

4.Custom节点常用内容:

  • 普通表达式:数学计算、iflerpnormalize

  • 局部变量声明float, float2, float3

5.常见报错来源:

语法元素 是否允许 原因
#define ❌  UE shader parser 会报错
#include ❌  Custom 节点无法控制文件结构
函数定义 ❌  不允许函数定义
类型别名(typedef 同样属于预处理或全局级定义

关于第三点函数定义:定义结构体(struct)和定义函数(function)的使用范围和限制是不同的,特别是在不同的上下文(如全局作用域、函数内部、Shader 代码的不同阶段)中。


 一、结构体定义(struct)为什么可以在任何地方出现

结构体在 HLSL 中是一种数据类型声明,类似于 C/C++ 中的 struct,用于组织数据,而不是执行逻辑。例如struct MyData {float3 position;float3 normal;};这种定义在全局作用域中、shader 顶部都可以写,HLSL 编译器在编译时会先解析这些结构体,就像普通的数据类型一样。

struct 关键字用来定义结构体(structure),是一种把多个不同类型的数据组合在一起的自定义数据类型。

作用

  1. 组织相关数据
    结构体能把相关的变量打包成一个整体,方便管理和传递。例如,一个顶点可能包含位置、法线、纹理坐标等信息,这些就可以放到一个结构体里。

  2. 作为输入输出接口
    在顶点着色器(VS)、像素着色器(PS)等函数之间,结构体常用来定义输入输出数据格式。这样可以保证数据完整且结构清晰。

  3. 代码更易读易维护
    结构体让代码更有层次,便于

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值