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节点常用内容:
-
普通表达式:数学计算、
if、lerp、normalize等 -
局部变量声明:
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),是一种把多个不同类型的数据组合在一起的自定义数据类型。作用
组织相关数据
结构体能把相关的变量打包成一个整体,方便管理和传递。例如,一个顶点可能包含位置、法线、纹理坐标等信息,这些就可以放到一个结构体里。作为输入输出接口
在顶点着色器(VS)、像素着色器(PS)等函数之间,结构体常用来定义输入输出数据格式。这样可以保证数据完整且结构清晰。代码更易读易维护
结构体让代码更有层次,便于

&spm=1001.2101.3001.5002&articleId=148769091&d=1&t=3&u=e7b185cf798c44fc974053027a330ae7)
4034

被折叠的 条评论
为什么被折叠?



