unity3d中深度相机_unity 深度相机 - CSDN
  • 工作原因,又把Unity3D捡起来了,需要实现一个深度相机。网上查了查资料,整理如下。 参考:http://williamchyr.com/2013/11/unity-shaders-depth-and-normal-textures/ 我的代码在: ...

    工作原因,又把Unity3D捡起来了,需要实现一个深度相机。网上查了查资料,整理如下。

    参考:http://williamchyr.com/2013/11/unity-shaders-depth-and-normal-textures/

    我的代码在:

    https://github.com/NianLi71/Camera-Util-Unity3D/tree/master/DepthCamera

    一、如下建立场景,做一排cube放入一个CubeRow中。放好MainCamera位置,然后复制出DepthCamera,这样两个相机的位置视角一致,方便后续调试。


    新建一个shader,参考链接中的地址,输入代码:

    // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
    
    Shader "Custom/DepthGrayscale" {
    SubShader {
    Tags { "RenderType"="Opaque" }
    
    Pass{
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag
    #include "UnityCG.cginc"
    
    sampler2D _CameraDepthTexture;
    
    struct v2f {
       float4 pos : SV_POSITION;
       float4 scrPos:TEXCOORD1;
    };
    
    //Vertex Shader
    v2f vert (appdata_base v){
       v2f o;
       o.pos = UnityObjectToClipPos (v.vertex);
       o.scrPos=ComputeScreenPos(o.pos);
       //for some reason, the y position of the depth texture comes out inverted
       //o.scrPos.y = 1 - o.scrPos.y;
       return o;
    }
    
    //Fragment Shader
    half4 frag (v2f i) : COLOR{
       float depthValue = Linear01Depth (tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.scrPos)).r);
       half4 depth;
    
       depth.r = depthValue;
       depth.g = depthValue;
       depth.b = depthValue;
    
       depth.a = 1;
       return depth;
    }
    ENDCG
    }
    }
    FallBack "Diffuse"
    }

    新建一个Material,并选择刚刚建好的shader文件



    给DepthCamera添加脚本文件,输入以下代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [ExecuteInEditMode]   // 可以在编辑界面看到深度绘制效果
    public class MainCameraDepth : MonoBehaviour {
    
    	public Material mat;
    	public int width = 512;
    	public int height= 512;
    
    	private Camera cam;
    	private RenderTexture rt;
    	private int image_id = 0;
    
    	void Start () {
    		cam = GetComponent<Camera>();   //获取当前绑定到脚本的相机
    
    		cam.depthTextureMode = DepthTextureMode.Depth;
    
    		//		rt = new RenderTexture (width, height, 24);  // 24 bit depth
    		//		cam.targetTexture = rt;
    	}
    
    	void OnRenderImage (RenderTexture source, RenderTexture destination){
    		Graphics.Blit(source,destination,mat);
    		//mat is the material which contains the shader
    		//we are passing the destination RenderTexture to
    	}
    	
    	// Update is called once per frame
    	void Update () {
    		
    	}
    }
    


    二、回到Unity主界面,将material文件拖拽给DepthCamera相机脚本,并将Audio Listener取消勾选。

    之后,如图将Main Camera的Camera方框取消勾选:


    在编辑界面即可看到深度图输出:


    看到全黑的cube原因是相机的远裁剪平面设置的太远了。将DepthCamera的Clipping Planes far调整近一些:


    即可看到灰度深度图:


    三、保存深度图到文件Duplicate复制DepthCamera,并重新命名SnapDepthCamera,再添加一个脚本文件SnapDepthCamera.cs,输入以下代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    [ExecuteInEditMode]   // 可以在编辑界面看到深度绘制效果
    public class SnapDepthCamera : MonoBehaviour {
    	
    	public Material mat;
    	public int width = 512;
    	public int height= 512;
    
    	private Camera cam;
    	private RenderTexture rt;
    	private int image_id = 0;
    	private bool SnapFlag = false;
    
    	void Start () {
    		cam = GetComponent<Camera>();   //获取当前绑定到脚本的相机
    
    		cam.depthTextureMode = DepthTextureMode.Depth;
    
    		rt = new RenderTexture (width, height, 24);  // 24 bit depth
    		cam.targetTexture = rt;
    	}
    
    	void OnRenderImage (RenderTexture source, RenderTexture destination){
    		Graphics.Blit(source,destination,mat);
    		//mat is the material which contains the shader
    		//we are passing the destination RenderTexture to
    
    		if(SnapFlag) {
    			RenderTexture currentRT = RenderTexture.active;   // save current active rendertexture
    			RenderTexture.active = destination;
    
    			Texture2D image = new Texture2D(destination.width, destination.height,TextureFormat.RGB24, false);
    			image.ReadPixels(new Rect(0, 0, destination.width, destination.height), 0, 0);
    			image.Apply();
    
    			savePNG (image, "./depthImages/camera_image" + image_id + ".png");
    
    			image_id++;
    			RenderTexture.active = currentRT; // restore 
    		}
    	}
    
    	private void savePNG(Texture2D image, string path_file) {
    		// store the texture into a .PNG file
    		byte[] bytes = image.EncodeToPNG ();
    
    		// save the encoded image to a file
    		System.IO.File.WriteAllBytes (path_file, bytes);
    	}
    
    	// Update is called once per frame
    	void Update () {
    		if (Input.GetKeyDown ("p")) {
    			SnapFlag = true;
    		} else
    			SnapFlag = false;
    	}
    }
    
    注意,在Update里我们不做保存操作,保存操作放到OnRenderImage中完成。

    之后在项目首页新建文件夹:depthImages/,之后运行程序,按'p'键即可保存深度图。



    展开全文
  • Unity3D Depth Camera(深度相机)的应用  作为3D世界里最重要的窗口,摄像机的应用就显得很重要,毕竟在屏幕上看到的一切都得用摄像机矩阵变换得来的嘛。  论坛上看到了一篇帖子讲非天空盒的背景做法,让我想起...

      Unity3D Depth Camera(深度相机)的应用

      作为3D世界里最重要的窗口,摄像机的应用就显得很重要,毕竟在屏幕上看到的一切都得用摄像机矩阵变换得来的嘛。

      论坛上看到了一篇帖子讲非天空盒的背景做法,让我想起其实很多界面合成画面可以用摄像机之间的交互来实现(避开用GUI,效率问题我没尝试过,但是貌似用深度相机比gui?以后试验下)

      首先说下深度相机,就是用2个或者2个以上的相机,设置好参数后自动到屏幕视觉合成的效果,应用上两个方面:1,背景图 2,用户界面。

      步骤:

      1.建立第二个相机,设置 Clear Flags 属性为 Depth Only (深度模式)

      把摄像机和摄像机面前要投影的东西放到场景以外开不到的地方。

      2.设置Depth属性

      主摄像机默认是-1 ,如果你的物体要显示在他层面之上,就设比他大的数,不然就设比他小的数

      3.设置贴图的Aniso Level属性到最高(9)

      这样贴图就能清晰些。

      4.最后去处摄像机自带的没用的组件

      去除掉Audio Listener之类的东西。

      放前面当界面用,放背后可以当背景,做些什么远处的树啊山啊之类的不错。

      这样的话,车仪表盘指针就可以编程让他动了。

    展开全文
  • [Unity3D]深度相机 Depth Camera 作为3D世界里最重要的窗口,摄像机的应用就显得很重要,毕竟在屏幕上看到的一切都得用摄像机矩阵变换得来的嘛。论坛上看到了一篇帖子讲非天空盒的背景做法,让我想起其实很多...

    [Unity3D]深度相机 Depth Camera

    作为3D世界里最重要的窗口,摄像机的应用就显得很重要,毕竟在屏幕上看到的一切都得用摄像机矩阵变换得来的嘛。
    论坛上看到了一篇帖子讲非天空盒的背景做法,让我想起其实很多界面合成画面可以用摄像机之间的交互来实现(避开用GUI,效率问题我没尝试过,但是貌似用深度相机比gui好?以后试验下)。
     
    首先说下深度相机,就是用2个或者2个以上的相机,设置好参数后自动到屏幕视觉合成的效果,应用上两个方面:1,背景图 2,用户界面。
     
    步骤:
    1.建立第二个相机,设置 Clear Flags 属性为 Depth Only (深度模式)
    把摄像机和摄像机面前要投影的东西放到场景以外开不到的地方。

     
    2.设置Depth属性
    主摄像机默认是-1 ,如果你的物体要显示在他层面之上,就设比他大的数,不然就设比他小的数
     
    3.设置贴图的Aniso Level属性到最高(9)
    这样贴图就能清晰些。
     
    4.最后去处摄像机自带的没用的组件
    去除掉Audio Listener之类的东西。
     

     

    放前面当界面用,放背后可以当背景,做些什么远处的树啊山啊之类的不错。
    这样的话,车仪表盘指针就可以编程让他动了。 ^ ^

     

     

    Camera属性详解

    http://www.cnblogs.com/rainmj/p/5335623.html

     

    posted on 2016-11-08 13:57 jiahuafu 阅读(...) 评论(...) 编辑 收藏

    展开全文
  • 作为3D世界里最重要的窗口,摄像机的应用就显得很重要,毕竟在屏幕上看到的一切都得用摄像机矩阵变换得来的嘛。 论坛上看到了一篇帖子讲非天空盒的背景做法,让我想起其实很多界面合成画面可以用摄像机之间的交互来...
    作为3D世界里最重要的窗口,摄像机的应用就显得很重要,毕竟在屏幕上看到的一切都得用摄像机矩阵变换得来的嘛。
    论坛上看到了一篇帖子讲非天空盒的背景做法,让我想起其实很多界面合成画面可以用摄像机之间的交互来实现(避开用GUI,效率问题我没尝试过,但是貌似用深度相机比gui好?以后试验下)。
    首先说下深度相机,就是用2个或者2个以上的相机,设置好参数后自动到屏幕视觉合成的效果,应用上两个方面:1,背景图 2,用户界面。
    步骤:
    1.建立第二个相机,设置 Clear Flags 属性为 Depth Only (深度模式)
    把摄像机和摄像机面前要投影的东西放到场景以外开不到的地方。
    2.设置Depth属性
    主摄像机默认是-1 ,如果你的物体要显示在他层面之上,就设比他大的数,不然就设比他小的数
    3.设置贴图的Aniso Level属性到最高(9)
    这样贴图就能清晰些。
    4.最后去处摄像机自带的没用的组件
    去除掉Audio Listener之类的东西。
    放前面当界面用,放背后可以当背景,做些什么远处的树啊山啊之类的不错。

    这样的话,车仪表盘指针就可以编程让他动了。 ^ ^


    转自 http://prolove10.blog.163.com/blog/static/138411843201010184026134/

    展开全文
  • 一:检视面板二 面板介绍1、ckearFlags : 空白旗子,把空白的地方显示Skybox 天空盒子Solider Color 纯色显示Depth: 只看深度高低(显示物体),空白不管(黑色)Don't Clear 只显示物体,其他都不显示(具体有待...
  • 欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌。   从相机到给定距离的视锥体大小 从...
  • 对其中还有 一些疑惑:就是 如果相机有天空盒 就无法截取到3D物体 比如Cube 等 Camera :主要对物体进行截取 Clear Flags 不选择 天空盒 Camera2: 主要对UI进行截取   using UnityEngine; using S...
  • Unity3D场景搭建5:相机

    2014-03-14 10:13:16
    Unity3D场景搭建5:相机(Cameras) 相机是一个能够捕获并为玩家显示世界的设备。通过设置和操纵相机,你可以真实而独特的显示你的游戏。在一个场景你可以有无限的相机。它们可以被设置为任意的渲染顺序,任意的的...
  • 在正式开始今天的文章之前,我们先来了解下Unity3D中相机吧。在Unity3D中相机是一个能够为玩家捕获并显示游戏世界的设备。通过操纵相机,我们可以使得我们的游戏场景以更加真实和独特的方式显示出来。在Uni
  • Unity中的多相机渲染

    2020-03-05 23:02:30
    一帧的渲染,可以有很多个相机进行渲染,相机渲染的物体由视锥体以及层级遮罩等决定,相机渲染的顺序由相机深度及其加载到场景的顺序决定;每个场景渲染的结果都是保存到硬件的缓冲区的,它们共用一个缓冲区...
  • 好吧,今天一个朋友说起有关3D场景使用的是广角相机导致前方的UI成出现了变形,(这个是不是可以用来做成变脸,呵呵),这里简单介绍一下在NGUI使用多个相机的一点心得,当然不一定要NGUI哦。 就从我现在手上...
  • Unity3D 后处理 深度图扫描线与扫描区域效果图思路 范例工程: GITHUB 该文章有使用额外的屏幕特效控制脚本/基类,并涉及到携程的使用 效果图 思路 1.计算出视锥体四边向量传入, 根据uv获取对应视锥体向量并结合...
  • Unity内生成深度贴图

    2019-08-21 09:52:05
    https://qiita.com/bokkuri_orz/items/08cbaeae6a34fed7f903 https://www.cnblogs.com/sifenkesi/p/4721649.html https://docs.unity3d.com/Manual/SL-PlatformDifferences.html https://blog.csdn.net/pupp...
  • Unity 3D 中可以把摄像机设置为正交。正交摄像机与 Unity 3D 中普通摄像机相比没有透视效果(近大远小),所以正交相机一般可以用于 2D 游戏开发或者是 3D ...在正交相机中唯一与显示范围相关的属性只有一个,那就是
1 2 3 4 5 ... 20
收藏数 1,888
精华内容 755
关键字:

unity3d中深度相机