Unity3D之高级渲染-Shader Forge增强版

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN视频网址:http://edu.csdn.net/lecturer/144

大家了解了Shader Forge的制作原理,也会使用Shader Forge制作渲染材质了,在实际项目开发中,我们会遇到各种各样的问题,有时候我们需要使用Shader Forge渲染的物体跟我们自己写的Shader相互配合才能起到作用,在配合的过程中就会遇到问题,下面就把笔者在项目开发中遇到的问题以及解决方案给读者介绍一下。

我们使用Shade Forge渲染了一个金属盔甲,这个金属盔甲里面还有一个透明的人头,渲染效果如下所示:

人脸使用的是带有Alpha通道的Shader处理,在转动的过程中,会出现人脸遮挡不住模型的情况,这样看起来就很怪异,效果如下所示:

上图箭头指示的地方没有被透明的人脸遮挡住,人脸渲染使用的Shader如下所示:

Shader "Unlit/Transparent_Test" {
Properties {
	_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

SubShader {
	Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
	LOD 100

	//ZWrite Off
	Blend SrcAlpha OneMinusSrcAlpha 

	Pass {
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma target 2.0
			#pragma multi_compile_fog

			#include "UnityCG.cginc"

			struct appdata_t {
				float4 vertex : POSITION;
				float2 texcoord : TEXCOORD0;
			};

			struct v2f {
				float4 vertex : SV_POSITION;
				half2 texcoord : TEXCOORD0;
				UNITY_FOG_COORDS(1)
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;

			v2f vert (appdata_t v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
				UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}

			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.texcoord);
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
			}
		ENDCG
	}
}

}

这个Shader也是Unity3D自带的Shader,只是修改了一下文件名字,为了能让透明的人脸遮住那半边盔甲,该如何修改?

Unity3D引擎为我们提供了渲染顺序,其实出现这个情况的主要问题也是渲染顺序问题,很明显是先渲染盔甲,再渲染透明的脸。问题找到了,接下来需要修改渲染顺序,就是先渲染透明的人脸材质,再渲染金属盔甲,这样就可以实现遮挡关系了,再原有Shader的基础上修改如下:

Shader "Unlit/Transparent_Test" {
Properties {
	_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

SubShader {
	Tags {"Queue"="Transparent-2000" "IgnoreProjector"="True" "RenderType"="Transparent"}
	LOD 100

	//ZWrite Off
	Blend SrcAlpha OneMinusSrcAlpha 

	Pass {
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma target 2.0
			#pragma multi_compile_fog

			#include "UnityCG.cginc"

			struct appdata_t {
				float4 vertex : POSITION;
				float2 texcoord : TEXCOORD0;
			};

			struct v2f {
				float4 vertex : SV_POSITION;
				half2 texcoord : TEXCOORD0;
				UNITY_FOG_COORDS(1)
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;

			v2f vert (appdata_t v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
				UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}

			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.texcoord);
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
			}
		ENDCG
	}
}

}

见上面代码的粗体部分,这样修改后将其挂到人脸的模型上,再看一下效果:

这样我们就解决了问题,是不是很简单?其实Shader编程没有想象的那么难,只要细心分析就可以得到想要的效果,所以学习Unity Shader编程一定要深入进去。

时间: 2024-10-28 21:52:41

Unity3D之高级渲染-Shader Forge增强版的相关文章

Unity3D之高级渲染-Shader Forge

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 在前面的博客中给读者介绍了关于使用Shader Forge的应用,Shader Forge这个组件使用起来还是非常方便的,尤其对于哪些对Shader编程不是很理解的开发者,使用它可以

Unity3D引擎之Shader Forge应用

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 本篇博客给读者介绍一个材质渲染的组件-Shader Forge,在材质渲染中可以起到事半功倍的效果,对于很多开发者不熟悉材质渲染的人来说,更容易上手,在应用时首先要对号入座,下面先把

shader forge卡通渲染!

自从用了shader forge,妈妈我再也不写shader了...... 写了3种,分别用的顶点法线.法线贴图.顶点法线+法线贴图,然后还有自发光和受光两种模式,那就是6种了吧... 最后来一张shader forge的node graph:

Unity3D教程宝典之Shader篇:第一讲Shader总篇

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 引言,在Unity3d里,所有的图形绘制都必须通过Shader,即着色器.一般的使用过程中,我们用到的都是unity自带的Shader,即build-in shader.学习Shader后,自己写的Shader能做出很多你想要的特殊效果,增强游戏的画面表现.例如 水的倒影. LOGO的光影闪过等等效果等等. Shader的分类 Shader按管线分类一般分为固定渲染管线与可编程渲染管线 1)固定渲染管线 ——这是标准的几何&光照(Tra

Unity3D引擎之渲染技术系列一

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者.国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术具体解释>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 在学习Unity引擎或者是其它3D游戏引擎时.常常遇到的问题就是各个坐标空间,在曾经的博客中也给读者介绍过,本篇博客里用通俗易懂的语言再给读者揭露一下为什么须要这么多坐标空间?以

【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-终端源码

[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-终端源码 广东职业技术学院 欧浩源 一.关于硬件电路 关于这个综合实训案例,具体需求详见<[CC2530入门教程-增强版]基础技能综合实训案例(基础版)-题目需求>. 我自己实在"全国职业院校技能大赛--物联网技术应用赛项"的Zigbee模块上实现的.该模块的电路应该和TI公司官方评估板的推荐电路差不多,我想现在市面上很多开发板也是参考这样的电路设计,只要您使用的开发板上有LED灯.按键输入.串口输出和一路A/

Unity3d 基于物理渲染Physically-Based Rendering之最终篇

前情提要: 讲求基本算法 Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF plus篇 Unity3d 基于物理渲染Physically-Based Rendering之实现 最后我们用fragment shader 实现,加上diffuse漫反射,代码和之前的surface差不多,只是多了reflect方向的计算,reflect方向的计算方法为用CG函数库中函数reflect, float3 reflect(float3 i, flo

Unity3d的批渲染 batch rendering

批渲染(Batch) batch render 是大部分引擎提高渲染效率的方法,基本原理就是通过将一些渲染状态一致的物体合成一个大物体,一次提交给gpu进行绘制,如果不batch的话,就要提交给很多次,这可以显著的节省drawcall,实际上这主要节省了cpu的时间,cpu从提交多次到提交一次,对gpu来说也不用多次切换渲染状态.当然能batch的前提一定是渲染状态一致的一组物体. Unity3d的批渲染分为两种,动态和静态 静态批 要求:必须使用同一张material,然后在编辑器里设置为st

Visual Basic 2010&amp;.NET 4高级编程(第6版)pdf

下载地址:网盘下载 <Visual Basic 2010&.NET 4高级编程(第6版)>讨论了最常见的编程任务和概念,通过大量示例阐述了Visual Basic 2010的各种新特性,包括许多.NET功能,如LINQ to SQL.LINQ to XML.XML.WCF等. 目录: 第Ⅰ部分 语言结构和环境 第1章 Visual Studio 2010 1.1 Visual Studio 2010:Express到Ultimate的各种版本 1.2 Visual Basic的关键字和