Ray Marching光线步进
Ray Marching(光线步进)是Ray Tracing的一种实现,之所以要用光线步进是为了获取物体的深度值,所以我们需要以摄像机位置为原点,步进式发射射线,当射线碰撞到物体之后,返回其深度信息,如果到视椎体的最大距离之前都没有返回,那么可以以此判断该方向无像素,最后根据返回的信息计算光照。
步骤:
第一步:定义视角相关的参数,观察点位置离观察目标点位置的距离,观察点视角度数,观察者头顶方向,得到摄像机矩阵
- _WorldSpaceCameraPos (unity library内置变量)
- i.wPos (像素的世界坐标,在vertex shader中得到)
由此得到ray=i.wPos -_WorldSpaceCameraPos
- 圆的center、radius
第二步:光线步进
每步进一次进行采样,定义步进精度STEP_SIZE,最大步进深度STEPS,如果光线和目标的距离小于圆的半径就算作捕捉到目标,返回光线的步进深度(长度),如果N次光线步进没有捕获到目标或步进深度大于最大步进深度,就返回float3(0,0,0)。
可以看出,RayMarching是有误差的,如果提高精度,减少步长,循环次数又太多,导致效率很低。
下面是一个在cube中绘制圆的简单示例
代码:
Shader "TYX/09PrimitiveSphere"
{
Properties
{
}
SubShader
{
Tags {
"Queue"="Transparent" }
//统透明度 源颜色 x 源通道 + 目标颜色 x(1 - 源通道)
//unity中默认的混合就是这种
//透明度为0的时候完全应用目标颜色,透明度为1的时候完全应用源颜色,如果是半透明就会发生两种颜色的混合
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "UnityLightingCommon.cginc"
struct appdata
{
float4 vertex : POSITION;