当前位置:网站首页>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"
}边栏推荐
- HCIP(14)
- Replacing the Raspberry Pi Kernel
- ROS2 series of knowledge (4): understand the concept of [service]
- Detailed explanation of TCP protocol
- [uniCloud] Application and Improvement of Cloud Objects
- Browser download shortcut to desktop (PWA)
- 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
- win10 固定本机IP
- leetcode: 1648. Color ball with decreasing sales value [Boundary find by two points]
猜你喜欢
![[Search topic] After reading the inevitable BFS solution to the shortest path problem](/img/f8/fbe906106dc8f7f7a6bd54d2dc3bc1.png)
[Search topic] After reading the inevitable BFS solution to the shortest path problem

How to download the Keil package

STK8321 I2C (Shengjia-accelerometer) example

IDEA无法识别module(module右下角没有蓝色小方块)

Replacing the Raspberry Pi Kernel

Data Middle Office Construction (VII): Data Asset Management

RTL8762DK UART (two)

项目越写越大,我是这样做拆分的

HCIP(14)

The fledgling Xiao Li's 113th blog project notes: Wisdom cloud smart flower watering device combat (2) - basic Demo implementation
随机推荐
Summary of JVM interview questions (continuously updated)
785. 快速排序
Modify Postman installation path
Flink 部署和提交job
Solve the problem that Excel opens very slowly after installing MySQL
【Make YOLO Great Again】YOLOv1-v7全系列大解析(Neck篇)
每周小结(*67):为什么不敢发表观点
MYSQL Index Analysis
【 】 today in history: on July 31, "brains in vats" the birth of the participant;The father of wi-fi was born;USB 3.1 standard
SC7A20 (Silan Micro-Accelerometer) Example
带wiringPi库在unbutu 编译 并且在树莓派运行
软考高级系统架构设计师系列之:系统开发基础知识
Raspberry pie arm version of GCC installed configuration and environment variables
Google Earth Engine - Error resolution of Error: Image.clipToBoundsAndScale, argument 'input': Invalid type
开源项目站点必备&交流区功能
链式编程、包、访问权限
Replacing the Raspberry Pi Kernel
机器学习初学者可以学哪些实战项目?
/usr/sbin/vmware-authdlauncher: error while loading shared libraries: libssl.so.1.0.2*Solution
【消息通知】用公众号模板消息怎么样?