Unity Shaders and Effects Cookbook (D-2) Cull Back背面剔除 -- 模型半边不可见

Posted _Captain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Shaders and Effects Cookbook (D-2) Cull Back背面剔除 -- 模型半边不可见相关的知识,希望对你有一定的参考价值。

这两天从其它游戏里面拔一些资源来给美术做参考,碰到很多模型都是只有一半可见,另一半要转动视角才可见。



用的是最简单的Diffuse Shader:

Shader "Custom/MyDiffuse" 

	Properties 
	
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" 
	
	SubShader 
		Tags  "RenderType"="Opaque" 
		LOD 200

		CGPROGRAM
		
		#pragma surface surf Standard

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;

		struct Input 
		
			float2 uv_MainTex;
		;


		fixed4 _Color;

		void surf (Input IN, inout SurfaceOutputStandard o) 
		
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		
		ENDCG
	
	FallBack "Diffuse"


那这个问题,其实是背面剔除的导致的。

我们知道物体都有两面,一个立方体盒子,有外面和里面之分,对于我们游戏来说,玩家一般只能看到外面,里面其实是不需要的。

所以默认Unity会开启背面剔除,把背对摄像机的面都剔除掉。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

三角面的正面朝向有两种定义方式:

1、顶点的绘制顺序

2、面法线的朝向


我不知道Unity是哪种方式。

但是我可以关闭背面剔除。


首先。

Unity 中的背面剔除有几种模式:

1、Cull Back 剔除背面,这是默认的方式

2、Cull Front 剔除正面

3、Cull Off 关闭剔除


默认是 Cull Back


使用 Cull Front 的话,修改Shader如下

Shader "Custom/MyDiffuse" 

	Properties 
	
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" 
	
	SubShader 
		Tags  "RenderType"="Opaque" 
		LOD 200
		Cull Front  
		
		CGPROGRAM
		
		#pragma surface surf Standard

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;

		struct Input 
		
			float2 uv_MainTex;
		;


		fixed4 _Color;

		void surf (Input IN, inout SurfaceOutputStandard o) 
		
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		
		ENDCG
	
	FallBack "Diffuse"


效果 转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn


剔除了正面,留下了背面,背面是不受光照的,所以会更暗。


关闭背面剔除,修改Shader 如下

Shader "Custom/MyDiffuse" 

	Properties 
	
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" 
	
	SubShader 
		Tags  "RenderType"="Opaque" 
		LOD 200
		Cull Off  
		
		CGPROGRAM
		
		#pragma surface surf Standard

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;

		struct Input 
		
			float2 uv_MainTex;
		;


		fixed4 _Color;

		void surf (Input IN, inout SurfaceOutputStandard o) 
		
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		
		ENDCG
	
	FallBack "Diffuse"


效果 转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn



以上是关于Unity Shaders and Effects Cookbook (D-2) Cull Back背面剔除 -- 模型半边不可见的主要内容,如果未能解决你的问题,请参考以下文章

Unity Shaders and Effects Cookbook (6-2) 透明裁剪着色器

Unity Shaders and Effects Cookbook (6-1) 使用 alpha 参数的 半透明着色器

Unity Shaders and Effects Cookbook (6-3) 修改渲染队列Queue 来 修改渲染顺序

Unity Shaders and Effects Cookbook (7-3) 在地形中使用顶点颜色做混合

Unity Shaders and Effects Cookbook (D-2) Cull Back背面剔除 -- 模型半边不可见

Unity Shaders and Effects Cookbook (5-1)LitSphere lighting model