Shader 反射光(reflection)

Posted 御雪妃舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shader 反射光(reflection)相关的知识,希望对你有一定的参考价值。

Unity中的shader使用反射光,相当于我们初中物理的反射光,入射光,发现,发射光的知识,实际上就是模拟现实中的光照。

但是Unity中的反射光向量Unity自己计算好的,不需要我们来计算,然后下文看书中的Cubemap有很多人觉得复杂,也有人问过我怎么创建,我这里先简单介绍下:


1.Cubemap


Cubemap:立体空间贴图(这是个人翻译的理解),实际上它属于贴图类型,只不过他是由六个方向的贴图连接成,下面直接看官网的解释:


cubemap是六张方形贴图的集合。



他支持的6张图的排布方式如下:



具体的大家可以去官网看下。


2.反射光


unity计算好反射向量后,我们搞起来还是比较容易的:

反射向量直接在worldRefl中获取,自发管设置为cubemap和参数的乘积,具体看下面的脚本:
Shader "MyShaders/SimpleReflection"

	Properties
	
		_MainTint("Diffuse Tint", Color) = (1,1,1,1)
		_MainTex("Base (RGB)", 2D) = "white" 
		_Cubemap("CubeMap", CUBE) = ""
		_ReflAmount("Reflection Amount", Range(0.01, 1)) = 0.5
	

	SubShader
	
		Tags "RenderType" = "Opaque" 
		LOD 200

		CGPROGRAM
		#pragma surface surf Lambert

		sampler2D _MainTex;
		samplerCUBE _Cubemap;
		float4 _MainTint;
		float _ReflAmount;

		struct Input
		
			float2 uv_MainTex;
			float3 worldRefl;
		;

		void surf(Input IN, inout SurfaceOutput o)
		
			half4 c = tex2D(_MainTex, IN.uv_MainTex) * _MainTint;
			o.Emission = texCUBE(_Cubemap, IN.worldRefl).rgb * _ReflAmount;
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		
		ENDCG
	
	FallBack "Diffuse"


3.效果

设置既效果如图:
Amnount只接近于0时,就是几乎没有反射光: 下面展示了不同值对应的效果:


以上就是简单的反射光,有什么建议的互相交流哈!
本文中所需要的Cubemap下载: 下载

以上是关于Shader 反射光(reflection)的主要内容,如果未能解决你的问题,请参考以下文章

Shader中基本光照模型

翻译8 Unity Reflections

c#的反射问题 --- 通过反射得到方法中的返回值怎么做?

shader之——单光源漫反射

三维模型反射光照射实现物体表面高光实现(WebGL进阶04)

shader之——多光源漫反射以及阴影