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难写的原因之一--如果发现得到的效果不对,我们 ...
随机推荐
- python基础篇_004_装饰器函数
python装饰器函数 1.装饰器函数引导 功能:计算函数执行时长 import time """ 方式一: 函数首位添加时间,差值就是函数执行时间 缺点:每个函数都要加 ...
- 用es6方式的写的订阅发布的模式
//发布订阅模式 class EventEmiter { constructor() { //维护一个对象 this._events = { } } on(eventName, callback) { ...
- Python学习——python的常用模块
模块:用一堆代码实现了某个功能的代码集合,模块是不带 .py 扩展的另外一个 Python 文件的文件名. 一.time & datetime模块 import time import dat ...
- Android的BroadcastReceiver组件
BroadcastReceiver的作用: BroadcastReceiver,是和Intent有很大关系的Android组件. Android中的 Intent 可以用来: 1. 在应用程序内部和应 ...
- JavaScript(六)
定时器 定时器在javascript中的作用1.制作动画2.异步操作3.函数缓冲与节流 定时器类型及语法 /* 定时器: setTimeout 只执行一次的定时器 clearTimeout 关闭只执行 ...
- goroutine 和线程的区别
好久没写点儿啥了,强行更新一下. 1,从使用上讲 1,goroutine 比线程更轻量级,可以创建十万.百万不用担心资源问题. 2,goroutine 和 chan 搭配使用,实现多线程.高并发 实现 ...
- 杭电1257 dp(java)
最少拦截系统 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的 ...
- angularjs ng-if 中的ng-model 值作用域问题
现象:最近做了一个需求,页面上使用了ng-if 条件做判断,导致通过使用 $scope 获取不到 ng-model 的值. 问题原因: ng-if这个指令单独开了一个作用域,它只可以继承,不可以进行往 ...
- phpMyAdmin 4.8.x 本地文件包含漏洞利用
phpMyAdmin 4.8.x 本地文件包含漏洞利用 今天ChaMd5安全团队公开了一个phpMyAdmin最新版中的本地文件包含漏洞:phpmyadmin4.8.1后台getshell.该漏洞利用 ...
- YARN的基础配置
基于HADOOP3.0+Centos7.0的yarn基础配置: 执行步骤:(1)配置集群yarn (2)启动.测试集群(3)在yarn上执行wordcount案例 一.配置yarn集群 1.配置yar ...