unity 拿shadowmap/ sample shadow map/拿_ShadowMapTexture
https://gamedev.stackexchange.com/questions/96051/unity-5-how-to-get-a-shadowmap
UNITY_DECLARE_SHADOWMAP(tex) - declares a shadowmap texture variable with name “tex”.
UNITY_SAMPLE_SHADOW(tex,uv) - samples shadowmap texture “tex” at given “uv” coordinate (XY components are texture location, Z component is depth to compare with). Returns single float value with the shadow term in 0..1 range.
UNITY_SAMPLE_SHADOW_PROJ(tex,uv) - similar to above, but does a projective shadowmap read. “uv” is a float4, all other components are divided by .w for doing the lookup.
https://docs.unity3d.com/Manual/SL-BuiltinMacros.html
https://docs.unity3d.com/ScriptReference/Rendering.CommandBuffer.SetShadowSamplingMode.html
using UnityEngine;
using UnityEngine.Rendering; [RequireComponent(typeof(Camera))]
public class RawShadowmapDepth : MonoBehaviour
{
public Light m_Light;
RenderTexture m_ShadowmapCopy; void Start()
{
RenderTargetIdentifier shadowmap = BuiltinRenderTextureType.CurrentActive;
m_ShadowmapCopy = new RenderTexture(1024, 1024, 0);
CommandBuffer cb = new CommandBuffer(); // Change shadow sampling mode for m_Light's shadowmap.
cb.SetShadowSamplingMode(shadowmap, ShadowSamplingMode.RawDepth); // The shadowmap values can now be sampled normally - copy it to a different render texture.
cb.Blit(shadowmap, new RenderTargetIdentifier(m_ShadowmapCopy)); // Execute after the shadowmap has been filled.
m_Light.AddCommandBuffer(LightEvent.AfterShadowMap, cb); // Sampling mode is restored automatically after this command buffer completes, so shadows will render normally.
} void OnRenderImage(RenderTexture src, RenderTexture dest)
{
// Display the shadowmap in the corner.
Camera.main.rect = new Rect(0, 0, 0.5f, 0.5f);
Graphics.Blit(m_ShadowmapCopy, dest);
Camera.main.rect = new Rect(0, 0, 1, 1);
}
} Texture2D _ShadowMapTexture;
声明下就能用了 不行你再blit一份出来用
注意一个事情是 他本身那个world to shadow的martrix是 screenspace的 和主camera有关 所以是不能用的(他做screenspace shadow)可以用
所以你要自己拿 world to shadowspace的matric
就是camera在light pos的那个space
====================================
经测试是拿到的
using UnityEngine;
using UnityEngine.Rendering;
[RequireComponent(typeof(Camera))]
public class rawdepth : MonoBehaviour { public Light m_Light;
RenderTexture m_ShadowmapCopy;
// Use this for initialization
void Start () {
RenderTargetIdentifier shadowmap = BuiltinRenderTextureType.CurrentActive;
m_ShadowmapCopy = new RenderTexture(, , );
CommandBuffer cb = new CommandBuffer(); // Change shadow sampling mode for m_Light's shadowmap.
cb.SetShadowSamplingMode(shadowmap, ShadowSamplingMode.RawDepth); // The shadowmap values can now be sampled normally - copy it to a different render texture.
cb.Blit(shadowmap, new RenderTargetIdentifier(m_ShadowmapCopy)); // Execute after the shadowmap has been filled.
m_Light.AddCommandBuffer(LightEvent.AfterShadowMap, cb); // Sampling mode is restored automatically after this command buffer completes, so shadows will render normally. } //Update is called once per frame
void OnRenderImage(RenderTexture src, RenderTexture dest)
{
//Display the shadowmap in the corner.
Camera.main.rect = new Rect(, , 0.5f, 0.5f);
Graphics.Blit(m_ShadowmapCopy, dest);
Camera.main.rect = new Rect(, , , );
Shader.SetGlobalTexture("_ShadowMap", shadowMap);//buildin
}
}
ref
https://www.cnblogs.com/wangze/archive/2010/04/07/1706640.html
https://docs.unity3d.com/ScriptReference/Rendering.CommandBuffer.SetShadowSamplingMode.html
采样的时候有proj的问题 要注意
fragmentshader:
float4 wpos;
wpos = i.worldPos;
//w在这里面了 proj的信息
float4 shadowCoord = mul(unity_WorldToShadow[0], wpos);
float4 shadow = tex2Dproj(_ShadowMap, shadowCoord);
//float4 shadow =tex2D(_ShadowMap, shadowCoord.xy/shadowCoord.w);//这个方法也对
=================
unity_WorldToShadow[0]这个matrix就是world 到camera 在light的V Proj到二维 再加 -1到1到0到1
是可用的
=================
拿 _CameraDepthTexture
https://docs.unity3d.com/Manual/SL-CameraDepthTexture.html
声明下
_CameraDepthTexture就可以了 看了下forward render path
Camera Detph在shadow caster pass会画这样一张rt 是在camera space的用两个matrix就可以转到lightspace做shadow用
它的位置也是个zprepass的位置 screen normal在接下来的pass里
看起来unity是在复用 shadow caster做张depth用
Depth texture is rendered using the same shader
passes as used for shadow caster rendering
(ShadowCaster
pass type). So by extension, if a shader does not support shadow casting (i.e. there’s no shadow caster pass in the shader or any of the fallbacks), then objects using that shader will not show up in the depth texture.
- Make your shader fallback to some other shader that has a shadow casting pass, or
- If you’re using surface shaders
, adding anaddshadow
directive will make them generate a shadow pass too.
===================
Done
unity 拿shadowmap/ sample shadow map/拿_ShadowMapTexture的更多相关文章
- Unity基础6 Shadow Map 阴影实现
这篇实现来的有点墨迹,前前后后折腾零碎的时间折腾了半个月才才实现一个基本的shadow map流程,只能说是对原理理解更深刻一些,但离实际应用估计还需要做很多优化.这篇文章大致分析下shadow ma ...
- Unity基础(5) Shadow Map 概述
这篇是自己看shadow map是的一些笔记,内容稍稍凌乱,如有错误请帮忙纠正 1.常见阴影处理方式 Shadow Map : using Z-Buffer Shadow Mapping 的原理与实践 ...
- [ZZ] Shadow Map
Shadow Map 如何能够高效的产生更接近真实的阴影一直是视频游戏的一个很有挑战的工作,本文介绍目前所为人熟知的两种阴影技术之一的ShadowMap(阴影图)技术. ShadowMap技术 ...
- [工作积累] shadow map问题汇总
1.基本问题和相关 Common Techniques to Improve Shadow Depth Maps: https://msdn.microsoft.com/en-us/library/w ...
- Shadow Map 原理和改进 【转】
http://blog.csdn.net/ronintao/article/details/51649664 参考 1.Common Techniques to Improve Shadow Dept ...
- (转)Shadow Map & Shadow Volume
转自:http://blog.csdn.net/hippig/article/details/7858574 shadow volume 这个术语几乎是随着 DOOM3 的发布而成为FPS 玩家和图形 ...
- Shadow Map 实现极其细节
这里不介绍算法原理,只说说在实现过程中遇到的问题,以及背后的原因.开发环境:opengl 2.0 glsl 1.0. 第一个问题:产生深度纹理. 在opengl中每一次离屏渲染需要向opengl提供 ...
- Shadow Map阴影贴图技术之探 【转】
这两天勉勉强强把一个shadowmap的demo做出来了.参考资料多,苦头可不少.Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势.本 ...
- GraphicsLab Project之再谈Shadow Map
作者:i_dovelemon 日期:2019-06-07 主题:Shadow Map(SM), Percentage Closer Filtering(PCF), Variance Shadow Ma ...
随机推荐
- poj 1962(并查集+带权更新)
Corporative Network Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 3664 Accepted: 13 ...
- 微擎系统BUG漏洞解决方法汇总(原创)
微擎微赞系统BUG漏洞解决方法汇总 弄了微擎系统来玩玩,发觉这个系统BUG还不少,阿里云的提醒都一大堆,主要是没有针对SQL注入做预防,处理的办法基本都是用转义函数. 汇总: 1. 漏洞名称: 微擎任 ...
- 查看linux版本及lsb_release安装及一些想法
https://blog.csdn.net/darkdragonking/article/details/61194308
- lr计算程序执行消耗时间的比较:
去除程序执行的两种方式: 1.通过一个事务:在需要消除的代码段,使用lr_wasted_time(wasteTime); querySubmit() { char newStr4[10000]=&qu ...
- getAllResponseHeaders() 必须放到onload里面
<html><head> <meta charset="utf-8"> <title>test</title> < ...
- scrapy抓取拉勾网职位信息(一)——scrapy初识及lagou爬虫项目建立
本次以scrapy抓取拉勾网职位信息作为scrapy学习的一个实战演练 python版本:3.7.1 框架:scrapy(pip直接安装可能会报错,如果是vc++环境不满足,建议直接安装一个visua ...
- 第8天-setInterval/setTimeout
setInterval是什么? setInterval()方法重复调用一个函数或执行一个代码段,在每次调用之间具有固定的时间延迟. setInterval(函数,间隔时间) 例如 function f ...
- leetcode136 Single Number
题意:数组中每个数字都出现了两次,只有一个出现一次,找出这个数 思路:很明显不能从头到位遍历来找,首先是超时的原因,再次就是这样很没意思·····但是却没想到什么好办法,因为不了解按位异或(XOR). ...
- JSON APIs and Ajax
1. 通过jQuery来绑定点击事件. 函数 $(document).ready()这个函数中的代码只会在我们的页面加载时候运行一次,确保执行js之前页面所有的dom已经准备就绪. 在$(docume ...
- Oracle REGEXP
ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与S ...