Unity shader学习之屏幕后期处理效果之高度雾,重建world pos方法2
这里使用一种更高效地从深度纹理中重建世界坐标的方法。
首先计算摄像机的视锥体的四条射线向量进行线性插值,插值后的值便是该像素在世界空间坐标下到摄像机的方向。
然后通过与深度值相乘即可得到摄像机位置到该像素的向量,加上摄像机的位置则是该像素在世界空间中的位置。
转载请注明出处:https://www.cnblogs.com/jietian331/p/9443343.html
c#代码:
using UnityEngine; public class HighFog2 : PostEffectRenderer
{
[SerializeField]
Color m_fogColor = Color.white;
[Range(0f, 1f)]
[SerializeField]
float m_fogDensity = 0.9f;
[SerializeField]
float m_fogPosY = 0.1f;
[SerializeField]
float m_fogDisappearHeight = ; protected override string ShaderName
{
get { return "Custom/Study/HighFog2"; }
} protected override void OnRenderImage(RenderTexture src, RenderTexture dest)
{
float fov = base.SelfCamera.fieldOfView;
float near = base.SelfCamera.nearClipPlane;
Transform camT = base.SelfCamera.transform; float halfFOV = fov * Mathf.PI / 360f;
float toTopDis = near * Mathf.Tan(halfFOV);
float toRightDis = toTopDis * (Screen.width / Screen.height);
Vector3 toTop = camT.up * toTopDis;
Vector3 toRight = camT.right * toRightDis;
Vector3 toCenter = camT.forward * near;
Vector3 topLeft = (toCenter + toTop - toRight) / near;
Vector3 topRight = (toCenter + toTop + toRight) / near;
Vector3 bottomLeft = (toCenter - toTop - toRight) / near;
Vector3 bottomRight = (toCenter - toTop - toRight) / near; Matrix4x4 matrix = Matrix4x4.identity;
matrix.SetRow(, bottomLeft);
matrix.SetRow(, bottomRight);
matrix.SetRow(, topLeft);
matrix.SetRow(, topRight); base.Mat.SetMatrix("_CameraRays", matrix);
base.Mat.SetColor("_FogColor", m_fogColor);
base.Mat.SetFloat("_FogDensity", m_fogDensity);
base.Mat.SetFloat("_FogPosY", m_fogPosY);
base.Mat.SetFloat("_FogDisappearHeight", m_fogDisappearHeight);
base.OnRenderImage(src, dest);
}
}
shader:
Shader "Custom/Study/HighFog2"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
} SubShader
{
Pass
{
ZTest Always
ZWrite Off
Cull Off CGPROGRAM
#pragma vertex vert
#pragma fragment frag #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;
sampler2D _CameraDepthTexture;
uniform float4x4 _CameraRays;
uniform float4 _FogColor;
uniform float _FogDensity;
uniform float _FogPosY;
uniform float _FogDisappearHeight; v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv; int index;
if(v.vertex.x < 0.5 && v.vertex.y < 0.5)
{
index = ;
}
else if(v.vertex.x > 0.5 && v.vertex.y < 0.5)
{
index = ;
}
else if(v.vertex.x > 0.5 && v.vertex.y > 0.5)
{
index = ;
}
else
{
index = ;
}
o.ray = _CameraRays[index].xyz; return o;
} fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv); float d = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv));
float3 worldPos = _WorldSpaceCameraPos + i.ray * d; float fogWeight;
if(worldPos.y < _FogPosY)
{
fogWeight = ;
}
else if(worldPos.y > _FogPosY + _FogDisappearHeight)
{
fogWeight = ;
}
else
{
fogWeight = - (worldPos.y - _FogPosY) / _FogDisappearHeight;
} return lerp(col, _FogColor, fogWeight * _FogDensity);
} ENDCG
}
} Fallback Off
}
效果图如下:

Unity shader学习之屏幕后期处理效果之高度雾,重建world pos方法2的更多相关文章
- Unity shader学习之屏幕后期处理效果之高斯模糊
高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加 ...
- Unity shader学习之屏幕后期处理效果之Bloom效果
Bloom特效是游戏中常见的一种屏幕效果.这种特效可以模拟真实摄像机的一种图像效果,它让画面中较亮的区域“扩散”到周围的区域中,造成一种朦胧的效果. Bloom的实现原理很简单,首先根据一个阈值提取出 ...
- Unity shader学习之屏幕后期处理效果之运动模糊
运动模糊,代码如下: using UnityEngine; public class MotionBlurRenderer : PostEffectRenderer { [Range(0.1f, 0. ...
- Unity shader学习之屏幕后期处理效果之均值模糊
均值模糊,也使用卷积来实现,之不过卷积中每个值均相等,且相加等于1. 代码如下, 子类: using UnityEngine; public class MeanBlurRenderer : Post ...
- Unity shader学习之屏幕后期处理效果之边缘检测
边缘检测的原理是利用一些边缘检测算子对图像进行卷积操作. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7232707.html 例如: 代码如下: usin ...
- Unity shader学习之屏幕后期效果之调整屏幕亮度,饱和度,对比度
Unity的屏幕后期处理效果,使用MonoBehaviour.OnRenderImage来实现. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7228063 ...
- Unity Shader 学习之旅
Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...
- Unity Shader 学习之旅之SurfaceShader
Unity Shader 学习之旅之SurfaceShader unity shader 图形图像 如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...
- 第四章 开始Unity Shader学习之旅(3)
1. 程序员的烦恼:Debug 调试(debug),大概是所有程序员的噩梦.而不幸的是,对一个Shader进行调试更是噩梦中的噩梦.这也是造成Shader难写的原因之一--如果发现得到的效果不对,我们 ...
随机推荐
- 微信小程序--家庭记账本开发--06
重要部分学习——记账簿 本次项目开发的目的主要是记账本的开发,最初自己想法简单,把家里的纸质记账簿变成手机上的记账簿.最终自己程序可以实现的功能可以记录每天的账目信息,并形成叠加效果,并按1.2.3… ...
- 图片懒加载、selenium和PhantomJS
1.图片懒加载 1.1 概念及实现原理 图片懒加载是一种网页优化技术.图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完, 将大大增加页面的首屏加 ...
- Lock锁方式解决线程安全问题
在JDK5.0之后新增加了一种更强大的线程同步机制---通过显示定义同步锁来实现线程同步解决线程安全问题.同步锁使用Lock对象充当. java.util.concurrent.locks.lock接 ...
- (79)Wangdao.com第十五天_JavaScript 对象的继承_prototype原型对象_封装_函数式编程
javascript 内置了许多 function 函数(){...} js 执行首先就会执行自己内置的函数定义 (function Function.function Object) 对象的继承 大 ...
- mobile_音悦台
音悦台 less 可以 width = 1080/67.5rem; /**** 变量定义 ****/ @px: 67.5rem; /**** Start ****/ #wrap { width: 10 ...
- [LeetCode] All Paths From Source to Target 从起点到目标点到所有路径
Given a directed, acyclic graph of N nodes. Find all possible paths from node 0 to node N-1, and re ...
- php基础--来自网页转载
注意:1.网页文件放在wamp中的www文件下:2.www文件下不能出现中文:网页浏览的方法:1.没有建立站点:localhost/文件所在位置2.建立站点:(1)站点-新建站点-打开对话框 (2)修 ...
- Gym 101606B - Breaking Biscuits - [凸包+旋转卡壳][凸包的宽度]
题目链接:https://codeforces.com/gym/101606/problem/B 题解: 对于给出的 $n$ 个点,先求这些点的凸包,然后用旋转卡壳求出凸包的宽度(Width (min ...
- linux安装jdk配置环境变量
tar -zxvf xxxx.tar.gz export JAVA_HOME=/usr/local/jdk/jdk1.8.0_201export PATH=$JAVA_HOME/bin:$PATHex ...
- kettle获取系统时间
Date.prototype.Format = function (fmt) { //author: meizz var o = { "M+": this.getMonth() + ...