当前位置:网站首页>Unity在BuildIn渲染管线下实现PlanarReflection的初级方法
Unity在BuildIn渲染管线下实现PlanarReflection的初级方法
2022-08-01 02:49:00 【ttod】
首先是要创建一个反向摄像机,同时让该反向摄像机渲染的图像发送给反射平面的Shader来与原来的颜色叠加,代码参考如下:
using UnityEngine;
public class PlanarReflection : MonoBehaviour
{
Camera m_ReflectionCamera;
Camera m_MainCamera;
RenderTexture m_RenderTarget;
[SerializeField]
GameObject m_ReflectionPlane;
[SerializeField]
Material m_FloorMaterial;
[SerializeField]
[Range(0f, 1f)]
float m_ReflectionFactor = 0.5f;
void Start()
{
GameObject reflectionCameraGo = new GameObject("ReflectionCamera");
m_ReflectionCamera = reflectionCameraGo.AddComponent<Camera>();
m_ReflectionCamera.enabled = false;
m_MainCamera = Camera.main;
m_RenderTarget = new RenderTexture(Screen.width, Screen.height, 24);
}
void Update()
{
m_FloorMaterial.SetFloat("_ReflectionFactor", m_ReflectionFactor);
}
void OnPreRender()
{
RenderReflection();
}
void RenderReflection()
{
m_ReflectionCamera.CopyFrom(m_MainCamera);
Vector3 cameraDirectionWorldSpace = m_MainCamera.transform.forward;
Vector3 cameraUpWorldSpace = m_MainCamera.transform.up;
Vector3 cameraPositionWorldSpace = m_MainCamera.transform.position;
Vector3 cameraDirectionPlaneSpace = m_ReflectionPlane.transform.InverseTransformDirection(cameraDirectionWorldSpace);
Vector3 cameraUpPlaneSpace = m_ReflectionPlane.transform.InverseTransformDirection(cameraUpWorldSpace);
Vector3 cameraPositionPlaneSpace = m_ReflectionPlane.transform.InverseTransformPoint(cameraPositionWorldSpace);
cameraDirectionPlaneSpace.y *= -1f;
cameraUpPlaneSpace.y *= -1f;
cameraPositionPlaneSpace.y *= -1f;
cameraDirectionWorldSpace = m_ReflectionPlane.transform.TransformDirection(cameraDirectionPlaneSpace);
cameraUpWorldSpace = m_ReflectionPlane.transform.TransformDirection(cameraUpPlaneSpace);
cameraPositionWorldSpace = m_ReflectionPlane.transform.TransformPoint(cameraPositionPlaneSpace);
m_ReflectionCamera.transform.position = cameraPositionWorldSpace;
m_ReflectionCamera.transform.LookAt(cameraPositionWorldSpace + cameraDirectionWorldSpace, cameraUpWorldSpace);
m_ReflectionCamera.targetTexture = m_RenderTarget;
m_ReflectionCamera.Render();
m_FloorMaterial.SetTexture("_ReflectionTex", m_RenderTarget);
}
}
其次是用于叠加反射颜色的Shader,对应的材质是添加给反射平面的。代码如下:
Shader "Custom/FloorTotal"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
_ReflectionFactor("ReflectionFactor",Range(0,1)) = 0.5
[Hide]_ReflectionTex("ReflectionTex",2D) = "White"{}
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue"="Geometry+1"}
LOD 200
Stencil{
Ref 1
Comp always
Pass replace
}
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
sampler2D _ReflectionTex;
struct Input
{
float2 uv_MainTex;
float4 screenPos;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
float _ReflectionFactor;
// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
// #pragma instancing_options assumeuniformscaling
UNITY_INSTANCING_BUFFER_START(Props)
// put more per-instance properties here
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color
float2 uv = IN.screenPos.xy / IN.screenPos.w;
uv.x = 1 - uv.x;
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color * (1 - _ReflectionFactor) + _ReflectionFactor * tex2D(_ReflectionTex,uv);
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
边栏推荐
- Introduction to the decision logic of WAASAP WebClient UI page labels
- /usr/sbin/vmware-authdlauncher: error while loading shared libraries: libssl.so.1.0.2*Solution
- One service layer needs to call the other two service layers to obtain data and assemble it into the final data. The data is all lists. How to design the cache?
- 设备树的树形结构到底是怎样体现的?
- The fledgling Xiao Li's 113th blog project notes: Wisdom cloud smart flower watering device combat (2) - basic Demo implementation
- Chain programming, packages, access
- win10 固定本机IP
- 初出茅庐的小李第112篇博客项目笔记之机智云智能浇花器实战(1)-基础Demo实现
- Four ways the Metaverse is changing the way humans work
- 《少年派2》:新男友竟脚踩两只船,林妙妙与钱三一感情回温
猜你喜欢
win10 固定本机IP
How to get started with YOLO?How to implement your own training set?
MYSQL query interception optimization analysis
Detailed explanation of TCP protocol
RTL8762DK WDG (six)
leetcode: 1648. Color ball with decreasing sales value [Boundary find by two points]
The fledgling Xiao Li's 114th blog project notes: Wisdom cloud intelligent flower watering device combat (3) - basic Demo implementation
IDEA debugging
MYSQL two-phase commit
情人节浪漫3D照片墙【附源码】
随机推荐
[Search topic] After reading the inevitable BFS solution to the shortest path problem
Basic implementation of vector
IDEA modifies the annotation font
opencv 缩小放大用哪种插值更好??
【入门教程】Rollup模块打包器整合
IDEA修改注释字体
Simple vim configuration
链式编程、包、访问权限
gateway gateway cross domain
【uniCloud】云对象的应用与提升
Detailed explanation of TCP protocol
how to edit the table of contents of an epub ebook
Which interpolation is better for opencv to zoom in and out??
设备树的树形结构到底是怎样体现的?
What practical projects can machine learning beginners learn?
pdb药物综合数据库
By CSDN, torn
初出茅庐的小李第113篇博客项目笔记之机智云智能浇花器实战(2)-基础Demo实现
Lua introductory case of actual combat 1234 custom function and the standard library function
leetcode: 1648. Color ball with decreasing sales value [Boundary find by two points]