中级Shader教程09 3D Raymarch框架

中级Shader教程介绍了如何构建3D Raymarching框架,包括从Unity相机信息抽取SetCamera函数,融合Unity光栅化与Raymarching场景,以及公共Raymarching代码的抽取。教程探讨了不同3D渲染实现方式,提供了实现简单3D场景的Raymarching代码示例。
摘要由CSDN通过智能技术生成

layout: post
title: “中级Shader教程09 3D Raymarch框架”
date: 2018-04-22 16:09:03
author: Jiepeng Tan
categories:

  • shader tutorial
    tags: shader_tutorial 3D_Raymarch shader
    img_path: /assets/img/blog/ShaderTutorial2D/Snow
    mathjax: true

Shader 视频教程

终于,我们暂时结束了2D,进入了令人兴奋的3D!!
在2D的屏幕中,绘制3D场景----升维进化!相信我,当你搞定了3D,再回头看2Dshader,你会想起一句广告词,so easy!妈妈再也不用担心我们的shader了.

1.3D Raymarch框架

  1. 获得相机位置ro
  1. 根据相机位置和朝向,计算当前像素所发出的射线ray的方向rd(ray dir)
  2. 求交ray和场景的碰撞点p(两种方式)

3.1 直接算式求解(比如射线到一个简单的圆的交点)
3.2 使用raymarching方式即一步步的递进ray,直到ray碰到场景,或达到ray的最大距离。

  1. 求得p处的法线和材质信息
  2. 根据4得到的信息求的p处的颜色

举个Raymarching方式例子:

// create by JiepengTan 
// date:2018-04-12 
// email: jiepengtan@gmail.com
Shader "FishManShaderTutorial/RayMarchSimpleScene"{
   
    Properties {
   
        _MainTex ("Texture", 2D) = "white" {
   }
    }
    SubShader{
   
        Tags {
    "RenderType"="Opaque" }
        LOD 100
        Pass {
   
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            //#include "ShaderLibs/Noise.cginc"
            struct appdata{
   
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f {
   
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            
            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v){
   
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            #define SPHERE_ID (1.0)
            #define FLOOR_ID (2.0)
            #define lightDir (normalize(float3(5.,3.0,-1.0)))


            float MapSphere(float3 pos){
   
                // center at float3(0.,0.,0.);
                float radius = 0.5;
                float3 centerPos = float3(0.,1.0+ sin(_Time.y*1.)*0.5,0.);
                return length(pos-centerPos) - radius;
            }
            float MapFloor(float3 pos ){
   
                float3 n= float3(0.,1.,0.);
                float3 d = 0;
                return dot(n,pos)-d;
            }
            float2 Map(float3 pos){
   
                float dist2Sphere = MapSphere(pos);// ID 1
                float dist2Plane = MapFloor(pos); // ID 2
                if(dist2Plane < dist2Sphere) {
   
                    return float2(dist2Plane,FLOOR_ID);
                }else{
   
                    return float2(dist2Sphere,SPHERE_ID);
                }
            }


            #define MARCH_NUM 256 //最多光线检测次数
            float2 RayCast(float3 ro,float3 rd){
   
                float tmin = 0.1;
                float tmax = 20.0;
               
                float t = tmin;
                float2 res = float2(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JiepengTan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值