体积渲染(1)——光线步进简单示例

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;
             
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值