文章目录
自学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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?