这里使用一种更高效地从深度纹理中重建世界坐标的方法。

首先计算摄像机的视锥体的四条射线向量进行线性插值,插值后的值便是该像素在世界空间坐标下到摄像机的方向。

然后通过与深度值相乘即可得到摄像机位置到该像素的向量,加上摄像机的位置则是该像素在世界空间中的位置。

转载请注明出处: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的更多相关文章

  1. Unity shader学习之屏幕后期处理效果之高斯模糊

    高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加 ...

  2. Unity shader学习之屏幕后期处理效果之Bloom效果

    Bloom特效是游戏中常见的一种屏幕效果.这种特效可以模拟真实摄像机的一种图像效果,它让画面中较亮的区域“扩散”到周围的区域中,造成一种朦胧的效果. Bloom的实现原理很简单,首先根据一个阈值提取出 ...

  3. Unity shader学习之屏幕后期处理效果之运动模糊

    运动模糊,代码如下: using UnityEngine; public class MotionBlurRenderer : PostEffectRenderer { [Range(0.1f, 0. ...

  4. Unity shader学习之屏幕后期处理效果之均值模糊

    均值模糊,也使用卷积来实现,之不过卷积中每个值均相等,且相加等于1. 代码如下, 子类: using UnityEngine; public class MeanBlurRenderer : Post ...

  5. Unity shader学习之屏幕后期处理效果之边缘检测

    边缘检测的原理是利用一些边缘检测算子对图像进行卷积操作. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7232707.html 例如: 代码如下: usin ...

  6. Unity shader学习之屏幕后期效果之调整屏幕亮度,饱和度,对比度

    Unity的屏幕后期处理效果,使用MonoBehaviour.OnRenderImage来实现. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7228063 ...

  7. Unity Shader 学习之旅

    Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...

  8. Unity Shader 学习之旅之SurfaceShader

    Unity Shader 学习之旅之SurfaceShader unity shader 图形图像  如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...

  9. 第四章 开始Unity Shader学习之旅(3)

    1. 程序员的烦恼:Debug 调试(debug),大概是所有程序员的噩梦.而不幸的是,对一个Shader进行调试更是噩梦中的噩梦.这也是造成Shader难写的原因之一--如果发现得到的效果不对,我们 ...

随机推荐

  1. .Net Core WebAPI 搭建

    .Net Core WebAPI 搭建 1.创建项目 使用开发工具为 Visual Studio 2017 2.创建 Controller 实体类 public class Book { public ...

  2. selenium截取具体元素图片(python版)

    原理: 1.截图(整个窗口) 2.获取此元素坐标 element = driver.find_element_by_id("xx") element.location) 3.获取此 ...

  3. js小笔记

    1.let ,const,var 区别 let:块级作用域,if,for,用完就不存在了. const:用来定义常量. var: 声明的变量在它所声明的整个函数都是可见的. 2.==和===的区别 1 ...

  4. Mac下GTest的基本使用

    Mac下GTest的基本使用 gtest全称Google C++ Testing Framework,它是从谷歌内部诞生并受到业界追捧的一个非常优秀的测试框架,支持如自动发现测试.自定义断言.死亡测试 ...

  5. Windows中杀死占用某个端口的进程(转)

    最近写项目,总是出现端口被占用的问题,原来傻傻的把电脑重启一下,终于有一天受不了了,想要想办法解决.刚开始从网上找了好多教程,发现不行.开始自己尝试,终于,成功的将占用端口的进程杀掉.在此记录下过程( ...

  6. 牛刀小试之用pytorch实现LSTM

    https://www.itcodemonkey.com/article/9008.html 要看一看

  7. HTML入门3

    HTML主要工作在于编辑文本结构和文本内容,也称语义(semantics)以便能够再浏览器正确地显示,下面开始介绍在文本中添加标题,段落,强调语句,创建列表等等 基础:标题和段落 内容结构化会使得阅读 ...

  8. thinkphp实现like模糊查询实例

    原网址:https://www.jb51.net/article/56846.htm

  9. Selenium 3----定位一组元素+多表单切换+多窗口切换

    定位一组元素 和定位单个元素类似,WebDriver提供了8种用于定位一组元素的方法.定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数. find_e ...

  10. String、StringBuilder以及StringBuffer

    博客地址:https://www.cnblogs.com/dolphin0520/p/3778589.html