文章目录
自学Raymarching汇总:
Unity Shader - Ray Marching Study Summary - 学习汇总
- Project
- References
最近忙的飞起,什么事情都扎堆的来。
好不容易挤出一些时间,继续学习。
这篇任务是,Raymarching获取表面法线。
通过类似之前文章:Unity Shader - ddx/ddy偏导函数测试,实现:锐化、高度图、Flat shading应用,的类似思路,在该文章中最后的Flat shading应用中,类似将高度图转法线图应用的方式(或是说,将梯度值转为法线)。
下面我们在Raymarching中,通过计算当前碰撞点的全局距离场与周边碰撞点的全局距离场的梯度值作为法线。
梯度值的核心思想理解视屏:动画带你理解偏导数和梯度 Gradients and Partial Derivatives(Physics Videos)熟肉
核心代码为:
float3 getNormal(float3 p) { // 获取碰撞当前点的法线
float d = sceneDF(p);
float2 e = float2(EPSILON, 0);
float3 n = d - float3(
sceneDF(p - e.xyy), // 其实就是 float3(d - d1, d - d2, d - d3);
sceneDF(p - e.yxy),
sceneDF(p - e.yyx));
return normalize(n);
}
fixed4 getColor(v2f i) {
float3 ori = i.ray; // 射线起点
float3 dir = normalize(i.ray); // 射线方向
float3 pos; // 当前步进到的位置
float dist; // 当前步进到的最近距离
float d; // 当前最近距离
float far = _ProjectionParams.z; // far
ori += _WorldSpaceCameraPos.xyz; // 偏移,加上相机位置
pos = ori; // 从起点出发
UNITY_LOOP
for (int it = 0; it
关注
打赏
热门博文
- 3D Assets (Textures & Model & Animations) & Game Design Ideas & DCC Tutorials & TA
- LearnGL - 学习笔记目录
- Unity - Timeline 知识汇总
- Unity Graphics - 知识点目录 - 停止翻译,因为发现官方有中文文档了
- Graphic资料
- Unity Lightmap&LightProbe局部动态加载(亲测2020以及以上版本官方修复了)
- Unity - 踩坑日志 - 低版本线性颜色空间渲染异常的 “BUG”
- Unity Shader - PBR 渲染 SP 导出的素材
- 什么是 3A 游戏?
- Photosohp - 实现 2D MetaBall、MetaFont