此后这个博客专门用于做失败记录了哈哈哈
https://www.youtube.com/watch?v=82iBWIycU0o&list=PL3POsQzaCw53iK_EhOYR39h1J9Lvg-m-g&index=2
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Camera))]
[ExecuteInEditMode]//Always updated in Camera
public class RayMarchCamera : MonoBehaviour
{
[SerializeField]
private Shader _shader;
public Material _raymarchMaterial
{
get
{
if (!_raymarchMat && _shader)
{
_raymarchMat = new Material(_shader);
_raymarchMat.hideFlags = HideFlags.HideAndDontSave;
}
return _raymarchMat;
}
}
private Material _raymarchMat;
public Camera _camera
{
get
{
if (!_cam)
{
_cam = GetComponent<Camera>();
}
return _cam;
}
}
private Camera _cam;
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (!_raymarchMaterial)
{
Graphics.Blit(source, destination);
return;
}
_raymarchMaterial.SetMatrix("_CamFrustum", CamFrustum(_camera));
_raymarchMaterial.SetMatrix("CamToWorldMatrix", _camera.cameraToWorldMatrix);
_raymarchMaterial.SetVector("_CamWorldSpace", _camera.transform.position);
RenderTexture.active = destination;
GL.PushMatrix();
GL.LoadOrtho();
_raymarchMat.SetPass(0);
GL.Begin(GL.QUADS);
//BL
GL.MultiTexCoord2(0, 0.0f, 0.0f);
GL.Vertex3(0.0f, 0.0f, 3.0f);
//BR
GL.MultiTexCoord2(0, 1.0f, 0.0f);
GL.Vertex3(0.0f, 0.0f, 2.0f);
//TR
GL.MultiTexCoord2(0, 1.0f, 1.0f);
GL.Vertex3(0.0f, 1.0f, 1.0f);
//TL
GL.MultiTexCoord2(0, 0.0f, 1.0f);
GL.Vertex3(0.0f, 1.0f, 0.0f);
GL.End();
GL.PopMatrix();
}
private Matrix4x4 CamFrustum(Camera cam)
{
Matrix4x4 frustum = Matrix4x4.identity;
float fov = Mathf.Tan((cam.fieldOfView * 0.5f) * Mathf.Deg2Rad);
Vector3 goUp = Vector3.up * fov;
Vector3 goRight = Vector3.right * fov * cam.aspect;
Vector3 TL = (-Vector3.forward - goRight + goUp);
Vector3 TR = (-Vector3.forward + goRight + goUp);
Vector3 BR = (-Vector3.forward + goRight - goUp);
Vector3 BL = (-Vector3.forward - goRight - goUp);
frustum.SetRow(0, TL);
frustum.SetRow(1, TR);
frustum.SetRow(2, BL);
frustum.SetRow(3, BR);
return frustum;
}
}
Shader "clat/RaymarchShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 ray : TEXCOORD1;
};
sampler2D _MainTex;
uniform float4 _CamWorldSpace;
uniform float4x4 _CamFrustum,_CamToWorld;
v2f vert (appdata v)
{
v2f o;
half index = v.vertex.z;
v.vertex.z = 0;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
o.ray = _CamFrustum[(int)index].xyz;
o.ray /= abs(o.ray.z);
o.ray = mul(_CamToWorld, o.ray);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
float3 rayDirection = normalize(i.ray.xyz);
float3 rayOrigin = _CamWorldSpace;
// return fixed4(rayDirection, 1);
return fixed4(30,30,30, 1);
}
ENDCG
}
}
}