【Unity Shader】浅析Unity shader中RenderType的作用及_CameraDepthNormalsTexture

Unity shader之RenderType的应用 阅读详情
初学Unity ShaderLab的时候,一定有接触过Unity Shader中的Tags标签块,比如:
在CODE上查看代码片派生到我的代码片
        "LightMode"="Vertex"  
        "Queue"="Transparent"   
        "IgnoreProjector"="True"   
        "RenderType"="Transparent"   
        "PreviewType"="Plane" 

其中LightMode标签指定该pass的渲染路径,Queue指定渲染顺序,IgnoreProjector指定是否忽略Projector的影响,PreviewType一般用于UIshader,PreviewType=Plane的话在材质面板看到的就是一个平面而不是材质球。

但是很多人对RenderType的了解可能相比其他标签要稍微淡薄一些,只知道比如渲染不透明物体使用Opaque,渲染透明物体使用Transparent等,而官网上有提到RenderType会用于材质替代渲染(RenderWithShader   SetReplacementShader),但究竟是如何去使用的,今天我总结下自己的理解。


首先,关于材质替代渲染,其主要就是Camera类的两个函数SetReplacementShader和RenderWithShader,其形参完全一样,第一个参数是用于替代的shader,以下记为RPShader,后一个参数是个字符串,表示用于替代的标签,包括自定义标签,以下记为mType,也就是假如我们调用SetReplacementShader(RPShader,"mType"),这个摄像机会检查所有渲染到的物体的shader,检查其是否包含mType标签,如果不存在则这个物体将不渲染,如果存在,在看这个标签的值,假如"mType"="A",则在RPShader中找到"mType"="A"的subshader并用它来替代这个物体,假如RPShader中不包含"mType"="A"的标签,那么这个物体也不会渲染。


接下来,我们需要去unity的内置shader中找一个shader,(内置shader请去官网下载源码)。

我们找到内置shader源码路径下这个文件夹:\DefaultResources,在里面可以找到这个shader:Camera-DepthNormalTexture.shader,(PS:5.x之前的版本还能找到Camera-DepthTexture.shader,从内容上看,其似乎会在UNITY_MIGHT_NOT_HAVE_DEPTH_TEXTURE这个宏条件成立的情况下渲染深度,之前尝试使用这个shader做替代渲染但没有成功得到和_CameraDepthTexture一样的效果,后来官网上看到这句:

    UNITY_MIGHT_NOT_HAVE_DEPTH_TEXTURE - defined if a platform might emulate shadow maps or depth textures by manually rendering depth into a texture.

不过在5.x新特性中可以看到这个内容:

所以5.x中我们已经找不到Camera-DepthTexture.shader这个shader了)

(补充:后来在5.x中研究了_CameraDepthTexture的渲染,写到这篇文章里了:http://blog.youkuaiyun.com/mobilebbki399/article/details/50559732)


打开Camera-DepthNormalTexture.shader,其内容如下:
在CODE上查看代码片派生到我的代码片
    Shader "Hidden/Camera-DepthNormalTexture" {  
    Properties {  
        _MainTex ("", 2D) = "white" {}  
        _Cutoff ("", Float) = 0.5  
        _Color ("", Color) = (1,1,1,1)  
    }  
      
    SubShader {  
        Tags { "RenderType"="Opaque" }  
        Pass {  
    CGPROGRAM  
    #pragma vertex vert  
    #pragma fragment frag  
    #include "UnityCG.cginc"  
    struct v2f {  
        float4 pos : SV_POSITION;  
        float4 nz : TEXCOORD0;  
    };  
    v2f vert( appdata_base v ) {  
        v2f o;  
        o.pos = mul(UNITY_MATRIX_MVP, v.vertex);  
        o.nz.xyz = COMPUTE_VIEW_NORMAL;  
        o.nz.w = COMPUTE_DEPTH_01;  
        return o;  
    }  
    fixed4 frag(v2f i) : SV_Target {  
        return EncodeDepthNormal (i.nz.w, i.nz.xyz);  
    }  
    ENDCG  
        }  
    }  
      
    SubShader {  
        Tags { "RenderType"="TransparentCutout" }  
        Pass {  
    CGPROGRAM  
    #pragma vertex vert  
    #pragma fragment frag  
    #include "UnityCG.cginc"  
    struct v2f {  
        float4 pos : SV_POSITION;  
        float2 uv : TEXCOORD0;  
        float4 nz : TEXCOORD1;  
    };  
    uniform float4 _MainTex_ST;  
    v2f vert( appdata_base v ) {  
        v2f o;  
        o.pos = mul(UNITY_MATRIX_MVP, v.vertex);  
        o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  
        o.nz.xyz = COMPUTE_VIEW_NORMAL;  
        o.nz.w = COMPUTE_DEPTH_01;  
        return o;  
    }  
    uniform sampler2D _MainTex;  
    uniform fixed _Cutoff;  
    uniform fixed4 _Color;  
    fixed4 frag(v2f i) : SV_Target {  
        fixed4 texcol = tex2D( _MainTex, i.uv );  
        clip( texcol.a*_Color.a - _Cutoff );  
        return EncodeDepthNormal (i.nz.w, i.nz.xyz);  
    }  
    ENDCG  
        }  
    }  
      
    SubShader {  
        Tags { "RenderType"="TreeBark" }  
        Pass {  
    CGPROGRAM  
    #pragma vertex vert  
    #pragma fragment frag  
    #include "UnityCG.cginc"  
    #include "Lighting.cginc"  
    #include "UnityBuiltin3xTreeLibrary.cginc"  
    struct v2f {  
        float4 pos : SV_POSITION;  
        float2 uv : TEXCOORD0;  
        float4 nz : TEXCOORD1;  
    };  
    v2f vert( appdata_full v ) {  
        v2f o;  
        TreeVertBark(v);  
          
        o.pos = mul( UNITY_MATRIX_MVP, v.vertex );  
        o.uv = v.texcoord.xy;  
        o.nz.xyz = COMPUTE_VIEW_NORMAL;  
        o.nz.w = COMPUTE_DEPTH_01;  
        return o;  
    }  
    fixed4 frag( v2f i ) : SV_Target {  
        return EncodeDepthNormal (i.nz.w, i.nz.xyz);  
    }  
    ENDCG  
        }  
    }  
      
    SubShader {  
        Tags { "RenderType"="TreeLeaf" }  
        Pass {  
    CGPROGRAM  
    #pragma vertex vert  
    #pragma fragment frag  
    #include "UnityCG.cginc"  
    #include "Lighting.cginc"  
    #include "UnityBuiltin3xTreeLibrary.cginc"  
    struct v2f {  
        float4 pos : SV_POSITION;  
        float2 uv : TEXCOORD0;  
        float4 nz : TEXCOORD1;  
    };  
    v2f vert( appdata_full v ) {  
        v2f o;  
        TreeVertLeaf(v);  
          
        o.pos = mul( UNITY_MATRIX_MVP, v.vertex );  
        o.uv = v.texcoord.xy;  
        o.nz.xyz = COMPUTE_VIEW_NORMAL;  
        o.nz.w = COMPUTE_DEPTH_01;  
        return o;  
    }  
    uniform sampler2D _MainTex;  
    uniform fixed _Cutoff;  
    fixed4 frag( v2f i ) : SV_Target {  
        half alpha = tex2D(_MainTex, i.uv).a;  
      
        clip (alpha - _Cutoff);  
        return EncodeDepthNormal (i.nz.w, i.nz.xyz);  
    }  
    ENDCG  
        }  
    }  
      
    SubShader {  
        Tags { "RenderType"="TreeOpaque" "DisableBatching"="True" }  
        Pass {  
    CGPROGRAM  
    #pragma vertex vert  
    #pragma fragment frag  
    #include "UnityCG.cginc"  
    #include "TerrainEngine.cginc"  
    struct v2f {  
        float4 pos : SV_POSITION;  
        float4 nz : TEXCOORD0;  
    };  
    struct appdata {  
        float4 vertex : POSITION;  
        float3 normal : NORMAL;  
        fixed4 color : COLOR;  
    };  
    v2f vert( appdata v ) {  
        v2f o;  
        TerrainAnimateTree(v.vertex, v.color.w);  
        o.pos = mul( UNITY_MATRIX_MVP, v.vertex );  
        o.nz.xyz = COMPUTE_VIEW_NORMAL;  
        o.nz.w = COMPUTE_DEPTH_01;  
        return o;  
    }  
    fixed4 frag(v2f i) : SV_Target {  
        return EncodeDepthNormal (i.nz.w, i.nz.xyz);  
    }  
    ENDCG  
        }  
    }   
      
    SubShader {  
        Tags { "RenderType"="TreeTransparentCutout" "DisableBatching"="True" }  
        Pass {  
            Cull Back  
    CGPROGRAM  
    #pragma vertex vert  
    #pragma fragment frag  
    #include "UnityCG.cginc"  
    #include "TerrainEngine.cginc"  
      
    struct v2f {  
        float4 pos : SV_POSITION;  
        float2 uv : TEXCOORD0;  
        float4 nz : TEXCOORD1;  
    };  
    struct appdata {  
        float4 vertex : POSITION;  
        float3 normal : NORMAL;  
        fixed4 color : COLOR;  
        float4 texcoord : TEXCOORD0;  
    };  
    v2f vert( appdata v ) {  
        v2f o;  
        TerrainAnimateTree(v.vertex, v.color.w);  
        o.pos = mul( UNITY_MATRIX_MVP, v.vertex );  
        o.uv = v.texcoord.xy;  
        o.nz.xyz = COMPUTE_VIEW_NORMAL;  
        o.nz.w = COMPUTE_DEPTH_01;  
        return o;  
    }  
    uniform sampler2D _MainTex;  
    uniform fixed _Cutoff;  
    fixed4 frag(v2f i) : SV_Target {  
        half alpha = tex2D(_MainTex, i.uv).a;  
      
        clip (alpha - _Cutoff);  
        return EncodeDepthNormal (i.nz.w, i.nz.xyz);  
    }  
    ENDCG  
        }  
        Pass {  
            Cull Front  
    CGPROGRAM  
    #pragma vertex vert  
    #pragma fragment frag  
    #include "UnityCG.cginc"  
    #include "TerrainEngine.cginc"  
      
    struct v2f {  
        float4 pos : SV_POSITION;  
        float2 uv : TEXCOORD0;  
        float4 nz : TEXCOORD1;  
    };  
    struct appdata {  
        float4 vertex : POSITION;  
        float3 normal : NORMAL;  
        fixed4 color : COLOR;  
        float4 texcoord : TEXCOORD0;  
    };  
    v2f vert( appdata v ) {  
        v2f o;  
        TerrainAnimateTree(v.vertex, v.color.w);  
        o.pos = mul( UNITY_MATRIX_MVP, v.vertex );  
        o.uv = v.texcoord.xy;  
        o.nz.xyz = -COMPUTE_VIEW_NORMAL;  
        o.nz.w = COMPUTE_DEPTH_01;  
        return o;  
    }  
    uniform sampler2D _MainTex;  
    uniform fixed _Cutoff;  
    fixed4 frag(v2f i) : SV_Target {  
        fixed4 texcol = tex2D( _MainTex, i.uv );  
        clip( texcol.a - _Cutoff );  
        return EncodeDepthNormal (i.nz.w, i.nz.xyz);  
    }  
    ENDCG  
        }  
      
    }  
      
    SubShader {  
        Tags { "RenderType"="TreeBillboard" }  
        Pass {  
            Cull Off  
    CGPROGRAM  
    #pragma vertex vert  
    #pragma fragment frag  
    #include "UnityCG.cginc"  
    #include "TerrainEngine.cginc"  
    struct v2f {  
        float4 pos : SV_POSITION;  
        float2 uv : TEXCOORD0;  
        float4 nz : TEXCOORD1;  
    };  
    v2f vert (appdata_tree_billboard v) {  
        v2f o;  
        TerrainBillboardTree(v.vertex, v.texcoord1.xy, v.texcoord.y);  
        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);  
        o.uv.x = v.texcoord.x;  
        o.uv.y = v.texcoord.y > 0;  
        o.nz.xyz = float3(0,0,1);  
        o.nz.w = COMPUTE_DEPTH_01;  
        return o;  
    }  
    uniform sampler2D _MainTex;  
    fixed4 frag(v2f i) : SV_Target {  
        fixed4 texcol = tex2D( _MainTex, i.uv );  
        clip( texcol.a - 0.001 );  
        return EncodeDepthNormal (i.nz.w, i.nz.xyz);  
    }  
    ENDCG  
        }  
    }  
      
    SubShader {  
        Tags { "RenderType"="GrassBillboard" }  
        Pass {  
            Cull Off          
    CGPROGRAM  
    #pragma vertex vert  
    #pragma fragment frag  
    #include "UnityCG.cginc"  
    #include "TerrainEngine.cginc"  
      
    struct v2f {  
        float4 pos : SV_POSITION;  
        fixed4 color : COLOR;  
        float2 uv : TEXCOORD0;  
        float4 nz : TEXCOORD1;  
    };  
      
    v2f vert (appdata_full v) {  
        v2f o;  
        WavingGrassBillboardVert (v);  
        o.color = v.color;  
        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);  
        o.uv = v.texcoord.xy;  
        o.nz.xyz = COMPUTE_VIEW_NORMAL;  
        o.nz.w = COMPUTE_DEPTH_01;  
        return o;  
    }  
    uniform sampler2D _MainTex;  
    uniform fixed _Cutoff;  
    fixed4 frag(v2f i) : SV_Target {  
        fixed4 texcol = tex2D( _MainTex, i.uv );  
        fixed alpha = texcol.a * i.color.a;  
        clip( alpha - _Cutoff );  
        return EncodeDepthNormal (i.nz.w, i.nz.xyz);  
    }  
    ENDCG  
        }  
    }  
      
    SubShader {  
        Tags { "RenderType"="Grass" }  
        Pass {  
            Cull Off  
    CGPROGRAM  
    #pragma vertex vert  
    #pragma fragment frag  
    #include "UnityCG.cginc"  
    #include "TerrainEngine.cginc"  
    struct v2f {  
        float4 pos : SV_POSITION;  
        fixed4 color : COLOR;  
        float2 uv : TEXCOORD0;  
        float4 nz : TEXCOORD1;  
    };  
      
    v2f vert (appdata_full v) {  
        v2f o;  
        WavingGrassVert (v);  
        o.color = v.color;  
        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);  
        o.uv = v.texcoord;  
        o.nz.xyz = COMPUTE_VIEW_NORMAL;  
        o.nz.w = COMPUTE_DEPTH_01;  
        return o;  
    }  
    uniform sampler2D _MainTex;  
    uniform fixed _Cutoff;  
    fixed4 frag(v2f i) : SV_Target {  
        fixed4 texcol = tex2D( _MainTex, i.uv );  
        fixed alpha = texcol.a * i.color.a;  
        clip( alpha - _Cutoff );  
        return EncodeDepthNormal (i.nz.w, i.nz.xyz);  
    }  
    ENDCG  
        }  
    }  
    Fallback Off  
    }  

(PS:顺便可以注意一下这个shader的完整路径名前面包括一个Hidden,当然你也可以这么给你的shader写上这个,这意味着你的shader在材质面板的shader选择界面中是隐藏的,unity很多内置的特殊功能的shader都使用了这个前缀路径,包括我们最熟悉的粉红色ErrorShader ^_^)

接下来讲解这个内置的Camera-DepthNormalTexture.shader,注意这个shader包含了很多SubShader,其中几乎包含了所有我们熟知的RenderType,不过没有Transparent,这个shader的主要作用就是当我们开启摄像机的DepthTextureMode为DepthNormals时该摄像机会使用这个shader以及"RenderType"这个标签做替代渲染,也就是SetReplacementShader(Camera-DepthNormalTexture,"RenderType"),刚刚有提过,只有被替代的shader中包含RenderType标签,且这个标签的值在替代的shader中存在,才会用这个SubShader去替代,显然RenderType=Transparent的标签在这个Camera-DepthNormalTexture.shader中并不存在。

当然_CameraDepthNormalsTexture我们知道其存储的内容是法线和深度,UnityCG.cginc文件中有定义两个函数,EncodeDepthNormal和DecodeDepthNormal用于对法线和深度进行编码和解码,我们已经看到在Camera-DepthNormalTexture.shader中的SubShader都是输出经过EncodeDepthNormal的深度和法线,其法线会被编码到xy分量,深度编码到zw分量。所以使用的时候需要通过DecodeDepthNormal将其解码。

以下是我尝试直接用这个shader做替代渲染的结果:

如下,一图是原始图像,二图是直接输出_CameraDepthNormalsTexture的结果,三图是我直接做替代渲染后得到的结果:

可以看到直接替代渲染和_CameraDepthNormalsTexture的内容是一样的,证明unity中_CameraDepthNormalsTexture是通过这个shader及RenderType标签做替代渲染得到的,其中RenderType=Transparent的物体并没有被写入_CameraDepthNormalsTexture,而RenderType=TransparentCutout的物体被裁切的地方也不会写入_CameraDepthNormalsTexture。

接下来尝试将两张图解码获取深度图:

以下一图是原始图像,二图是直接输出_CameraDepthTexture,三图是输出Linear01Depth(tex2D(_CameraDepthTexture,i.uv).r),四图是输出经过Decode解码的_CameraDepthNormalsTexture的深度,五图是输出我直接替代渲染后并经过Decode解码的深度:


可以注意到三、四、五这三张图的颜色范围相近,也就是说_CameraDepthNormalsTexture中存的深度值是在eye到farClipPlane之间范围为0-1的,通过Linear01Depth函数将_CameraDepthTexture转换后输出的也是这个结果(图三)。

不过注意图三会发现第五个shader,其RenderType=Opaque的物体并没有被写入_CameraDepthTexture,虽然上图是在测试的时候关闭了它的zwrite,但实际上开启zwrite得到的也是这个效果,这是因为这个shader其内容只包含一个RenderType=Opaque的pass,是从Unlit shader的基础上修改的,之前有提到过_CameraDepthTexture在5.x中似乎不再是通过替代渲染得到了,而_CameraDepthNormalsTexture貌似还是替代渲染获得的,所以图四和图五这个shader显示都是正常的,同样是在无论zwrite是否开启的情况下。

最后一个,就是注意到我的最后一个物体的shader其RenderType=Opaque,但是zwrite off,也就是说不会写入深度缓存,但因为其RenderType=Opaque的,所以对于_CameraDepthNormalsTexture其还是未关闭写入的。

以上就是经过试验得出的结论,希望对你理解RenderType的作用有所帮助。
原文地址:http://blog.youkuaiyun.com/mobilebbki399/article/details/50512059
Shader 学习笔记(11) RenderType为Transparent的混合透明 透明度混合可以实现真正的透明,本例中采用的混合方式为Blend SrcAlpha OneMinusSrcAlpha.Blend命令后接着写入不同的混合方式.混合方式有多种组合(后续单独写一篇).SrcAlpha OneMinusSrcAlpha的混合后效果的公式为Shader "wx/AlphaBlendMat"{ Properties{ _Color("Main Tint",Color)=... 阅读详情

相关推荐

Unity-URP 动态设置Camera.Rendering的参数

/URP中的摄像机参数基本会使用该API来修改。

枫叶的博客 2437

unity shader之基础 一二三:渲染简介

一:渲染流水线: 应用阶段:主要在CPU执行,准备好需要渲染的数据,输出渲染图元 几何阶段:在GPU执行,主要处理顶点的坐标空间转换,把这些处理过的数据传递给下一阶段 光栅化阶段:在GPU执行,对上一阶段产生的数据,进行着色,最终输出到屏幕上 由于顶点数量要远小于片元数量的,所以一个片元的颜色、深度等,是对顶点进行线性插值得到的 裁剪:把不在摄像机视野内的顶点裁剪掉 三角形设置:根据顶点数据,生成三角形数据 三角形遍历:根据像素和三角形的覆盖情况,获取片元 片元着色器:进行着色 逐片元

qq_37672438的博客 1214

Unity渲染管线与Shader面试核心:从原理到实战的深度解析

图形渲染管线是计算机图形学的核心概念,它定义了从三维场景数据到最终屏幕像素的完整处理流程。其基本原理包括应用阶段的数据准备、几何阶段的坐标变换、光栅化阶段的像素转换以及逐片段操作的颜色混合与测试。理解渲染管线的价值在于能够针对不同硬件平台和应用场景(如移动端、PC游戏、VR应用)进行性能优化与效果定制。在Unity引擎中,开发者需要在前向渲染与延迟渲染之间做出关键抉择,这直接关系到项目的性能表现与视觉效果实现。本文聚焦于Unity面试中的高频考点,深入探讨渲染管线实现、Shader优化策略以及卡通渲染等实战

weixin_30667649的博客 368

【Unity Shader】Shadow Caster、RenderType和_CameraDepthTexture

在做很多效果的时候我们需要使用_CameraDepthTexture和_CameraDepthNormalsTexture,其中_CameraDepthTexture存储的是屏幕深度信息,而_CameraDepthNormalsTexture存储的还包括法线信息,常会用到的情况,比如做景深效果,我们需要根据深度来对模糊的图像和正常的图像插值完成景深效果,或者软粒子效果,需要根据深度差判断粒子网格是

MrASL的博客 1万+

Unity渲染顺序深度解析:RenderQueue核心原理与五大实战应用

在计算机图形学中,渲染顺序是决定像素最终颜色的关键机制,它直接影响了视觉正确性与渲染性能。其核心原理在于GPU必须按序执行绘制命令,而深度测试与混合等管线状态决定了像素的写入与合成方式。掌握渲染顺序的技术价值在于,开发者可以精准控制物体间的遮挡与混合关系,从而解决透明物体错乱、UI融合等视觉顽疾,并有效优化性能减少过度绘制。这一技术广泛应用于游戏UI与3D场景的融合、多层透明特效的正确呈现、角色描边高亮、渲染性能优化以及自定义后处理效果等场景。本文聚焦Unity引擎中的RenderQueue,这一底层调度指

weixin_30698297的博客 467

深度剖析URP渲染管线:解决材质消失与深度测试失效的DepthOnlyPass缺失问题

在现代实时渲染管线中,深度缓冲(Z-Buffer)是决定像素可见性的核心技术,它通过深度测试机制高效解决物体间的遮挡关系。其原理是在渲染颜色前,先将场景中物体的深度信息写入专门的缓冲区,后续渲染时通过比较深度值来丢弃被遮挡的片元,从而大幅减少过度绘制(Overdraw),提升渲染性能。这一机制在Unity通用渲染管线(URP)中通过深度预渲染阶段实现,其技术价值在于为屏幕空间后处理效果(如SSAO、景深)提供准确的深度图,并确保复杂场景中渲染顺序的正确性。当自定义Shader缺失关键的DepthOnlyPa

weixin_34208283的博客 436

Unity描边Shader实战:从背面膨胀到屏幕后处理,彻底掌握轮廓渲染

在计算机图形学中,轮廓渲染(Outline Rendering)是一种用于突出物体边缘、增强视觉层次的核心技术。其基本原理是通过检测物体表面在深度、法线或颜色上的不连续性,来识别并高亮显示边界区域。这项技术的核心价值在于能显著提升场景的可读性和视觉表现力,广泛应用于游戏角色高亮、交互反馈、卡通渲染(Cel-Shading)以及各类风格化视觉特效中。从实现层面看,主要分为物体空间法(如背面膨胀)和屏幕空间后处理法两大流派。前者通过沿法线挤出模型背面实现,适合快速原型和单个物体突出;后者基于深度/法线纹理进行边

weixin_30321449的博客 350

【Unity Animation 2D】从零到一:骨骼绑定与IK动画实战指南

本文详细介绍了Unity中2D骨骼绑定与IK动画的实战流程,从角色素材准备、骨骼系统创建到权重绘制和IK设置,逐步指导开发者掌握2D动画制作技巧。通过反向动力学(IK)技术,实现更自然的角色动画效果,适用于游戏开发和动画制作。

weixin_30430677的博客 369

Unity深度特效开发全流程:从深度纹理获取到Shader优化实战

深度缓冲是计算机图形学中记录像素到相机距离的核心数据结构,它通过存储每个像素的深度值来实现遮挡检测和三维空间感知。其工作原理是在渲染管线中,将物体顶点变换到裁剪空间后,通过深度测试决定像素的可见性。深度信息的技术价值在于为屏幕空间特效提供了关键的几何数据,是实现景深、体积雾、边缘光等高级视觉效果的基础。在游戏开发与实时渲染的应用场景中,深度纹理的获取、解码与空间重建是高频技术难点。本文聚焦Unity引擎,针对深度纹理的精度处理、世界空间位置重建以及特效Shader编写中的常见问题,提供系统性的解决方案与性能

weixin_34341117的博客 358

Cadence Virtuoso里搞定斩波运放AC仿真:PSS+PAC保姆级设置避坑指南

然而,当工程师们尝试在Cadence Virtuoso环境中对这种特殊结构进行AC特性分析时,往往会遇到传统AC仿真方法失效的困境——这正是PSS(Periodic Steady-State)与PAC(Periodic AC)仿真组合大显身手的场景。实际项目中我们常采用"先快后精"的两步法:先用快速设置确认大体趋势,再针对关键频段进行精细仿真。例如某次设计迭代中,将harmonics从10增加到20后,发现在1MHz处的相位裕度估算误差达15°,这解释了之前样机测试时的振荡问题。

weixin_33508411的博客 449

国家大地2000坐标系投影坐标转高德地图经纬度坐标-【高斯投影坐标】

国家大地2000坐标系投影坐标转换成高德经纬度坐标显示画图。

devil_zhuzhu的博客 1万+

Unity Sprite Shaders 全功能解析:Spine 精灵 Uber Shader 的照明、混合与渲染原理

本文是 spine-runtimes 仓库中 [Sprite 目录 README](https://link.gitcode.com/i/090ecaf7be2734978228b468e848a7bd) 的技术解读与源码级展开。Spine Unity 运行时内置了一套专门为 Sprite 渲染优化的 Uber Shader(一套 shader 通过开关组合覆盖多种渲染需求),支持 Forward

gitblog_00193的博客 172

10.Labview局部变量、全局变量、引用、属性节点、调用节点用法理解及精讲

本文的结构还是首先教大家明确概念问题,然后深入理解概念并学会使用,最后在理论基础掌握的基础上,通过实例来强化大家的理解。本文依旧是**先理论后实践**的教学方式,欢迎留言或私聊提问。

关注我,更多技术问题欢迎私聊~ 1万+

Unity屏幕空间物体描边与幽灵遮挡后处理实现

屏幕空间描边是游戏开发中常见的目标高亮技术,但物体被障碍物遮挡时如何提示玩家位置则更具挑战。借助Unity后处理管线中的深度法线纹理,可以检测场景几何边缘,再结合目标物体的独立深度渲染,能够同时实现可见物体的轮廓描边与遮挡物体的幽灵透视效果。该方案不依赖模型额外顶点数据,只需在主相机挂载脚本并配合两个Shader,即可通过Layer统一控制多个目标,适用于任务指引、战术指示器、解谜高亮等批量标记场景。相比逐物体编写材质,统一的后处理流程在性能和维护成本上更优,尤其适合需要灵活切换目标或大面积部署的队伍协作玩

weixin_33924312的博客 413

数字后端:版图基础seal ring

seal ring结构是为了防止划片或封装对芯片造成破坏,从而在芯片与划片道(scribe line)之间添加的一圈保护环

m0_61544122的博客 1万+

别再无脑调打码平台了!聊聊 ddddocr 在爬虫验证码识别中的真实边界

ddddocr是国产开源社区的优秀成果,它大幅降低了验证码识别的入门门槛。工具的自由不等于工程的自由。真正的能力不在于“会不会调库”,而在于能否准确判断工具的适用边界、构建鲁棒的容错机制、并在成本与效果之间做出理性权衡。下次当你准备在爬虫中加入验证码识别时,不妨先问自己:这个站点的验证码类型是否在ddddocr的能力圈内?我的预处理是否针对该站点做过专项调试?我的失败重试和监控机制是否完备?如果三个问题都能肯定回答,那么ddddocr就是你的利器;如果有任何一个犹豫,请先补齐短板再上路。评论区交流:你用。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1279

Unity模型描边方案全解析:Shader、后处理与代码生成对比

在实时渲染中,轮廓描边是卡通风格和物体高亮的常见需求,其本质是提取屏幕空间或几何空间的视觉边界。Unity提供了多种描边实现路径:基于顶点法线外扩的Shader方案通过背面渲染生成轮廓,性能出色但受法线质量影响;屏幕空间后处理利用深度法线检测边缘,风格统一但开销较高;GL绘制及CPU网格生成则适合调试和精确控制。理解不同方案的原理、性能代价与平台适配,能帮助开发者根据模型复杂度、目标平台及美术风格做出合理选型。本文结合实际案例,对比分析各类Unity描边方法的优劣与工程坑点,为渲染技术选型提供参考。

weixin_34242509的博客 338

光芯片Photodiode 原理,设计与版图

但是光电二极管相对较大,因为需要接收足够的入射光线,此外,光电二极管的厚度比较小,通常位于 1 um 以下(为了波导模式更好地在波导中传输,减少损耗)。从下图中可以看出,当反偏时,即有光在耗尽层被吸收被转换为电流信号时,增加反向偏压几乎不影响反向电流,因此,对于光电二极管来说,反向电压并不影响反向电流的大小。不施加外部电压(开路状态),光生电压直接输出,流出的电流受到抑制,在两端积累一定的电位差,类似太阳能电池,具体特点是噪声低,但响应速度慢。因此,需要尽可能的减少暗电流,以增加元件对光的灵敏度。

u011699626的博客 980

Unity模型描边方案全解析:Shader、后处理与轮廓网格对比

在Unity游戏开发中,描边技术常用于角色轮廓、选中反馈和风格化渲染。其实现原理涉及顶点法线外扩、深度法线边缘检测、模板缓冲以及网格生成等多种技术路径。不同方案的性能开销、效果稳定性和适用场景差异显著,直接影响移动端表现与美术效果。理解各方案的底层机制,有助于开发者根据目标设备与需求做出合理选型,并规避描边断裂、穿模、闪烁等常见问题。从通用技术概念出发,全面对比常用描边实现方式,并给出工程实践建议。

weixin_34301132的博客 331

BAT031:按列表名单将路径a下的文件夹批量剪切到路径b

摘要:按列表名单将路径a下的文件夹批量剪切到路径b。

qq_31762031的博客 1218

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【Shader进阶】SubShader块标签Tags——RenderType

目录 目的:理解RenderType的作用 ,当初学习《Shader入门精要》时写有如下总结 使用替换的着色器渲染(官方解释) 一、 Camera.SetReplacementShader实战 二、Camera.SetReplacementShader总结 三、Camera.RenderWithShader实战 四、Camera.RenderWithShader总结 目的:理解Ren...

两水先木示的博客 2417

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Unity Shader学习六:渲染顺序与渲染控制指令

观前提示:本文章是个人笔记,只是给自己看的,我自己看得懂就行。

miwuwu的博客 1851

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

unity shader之 RenderType的作用

Tags{ “RenderType” = “Opaque” } 替换shader时候用的。 比如,你希望全场景的带某个标签的shader统一换了 Camera.SetPlacementShader(Shader1, “”); 这样就全部替换了 Camera.SetPlacementShader(Shader1, “RenderType”); 这样只替换RenderType的value一样的 Tags{ “RenderType”=“Opaque” "CheckRenderTypeTag=“On” } Came

游戏人生 2016
上一篇: 【Unity Shader】Shadow Caster、RenderType和_CameraDepthTexture
下一篇: Unity Shader-边缘光(RimLight)效果
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值