shader de entrada Esencial notas de estudio 22 avanzados textura - Textura del cubo - reflexión refracción mapeado de entorno

I. Introducción

Textura del cubo de mapeo es un entorno de ejecución, la textura cubo y consta de seis imágenes.
El muestreo es el de partida mediante la extensión del centro de la parte exterior del cubo, con uno de los seis textura de intersección se produce, el resultado se calcula a partir de la muestra a la intersección.

Textura del cubo beneficios: sencillo y rápido, la fruta fresca es buena, Desventajas: Cuando los cambios de escena tienen que regenerar la textura del cubo, y no pueden ser auto-reflexivo, por lo que tenemos que hacer uso de cuerpo convexo.

En segundo lugar, las cajas de cielo

el uso de Skybox es el mapeo Textura del cubo.

Un método para simular el fondo del juego, su material de Skybox, utilizando seis textura, que textura Modo Wrap 6, que se encargue de la abrazadera, necesidad de interceptar los valores en la frontera, para evitar el fenómeno de falta de coincidencia.

Hay tres atributos: material de tinte de color para controlar el color del conjunto, caja de exposición para ajustar el brillo del cielo, rotación de la caja cielo para ajustar el ángulo de rotación de la dirección + y-eje.

Sky box se hace después de que todos los objetos opacos, la red detrás del uso de un cubo o un segmento de esfera.

En tercer lugar, crear un entorno de mapeado de texturas de cubo

Cubo mapa de textura se utiliza típicamente para simular el ambiente de material metálico.

Crear un método de mapeo de textura medio ambiente cubo en tres formas:

1. Crear un diseño especial directamente de las texturas

Entonces tenemos que proporcionar un diseño de textura especial, tal como un cubo ampliar planta de cruz, diseño panorámica. Luego textura texturas Tipo se establece en cubemap podemos, en representación basada en la física, que suele utilizar una imagen de HDR para generar alta calidad cubemap.
El funcionario recomienda el uso de este método, se puede comprimir datos de textura, y el apoyo para la corrección de borde, reflexión suave, HDR y otras funciones.

2. Crear un manual de recursos cubemap, a continuación, 6 Figura asignado a él

3. generada por el script

public class RenderCubemapWizard : ScriptableWizard {
	
	public Transform renderFromPosition;  //在这个指定的位置动态创建摄像机
	public Cubemap cubemap;  //获取得出的cubemap
	
	void OnWizardUpdate () {      //编辑器更新时调用
		helpString = "Select transform to render from and cubemap to render into";   //提示
		isValid = (renderFromPosition != null) && (cubemap != null);  //设置按钮是否可以点击
	}
	
	void OnWizardCreate () {   //当向导被打开或只要用户在向导改变了某些东西时被调用。
		// create temporary camera for rendering
		GameObject go = new GameObject( "CubemapCamera");
		go.AddComponent<Camera>();
		// place it on the object
		go.transform.position = renderFromPosition.position;
		// render into cubemap		
		go.GetComponent<Camera>().RenderToCubemap(cubemap);  //渲染出cubemap
		
		// destroy temporary camera
		DestroyImmediate( go );//销毁摄像机
	}
	
	[MenuItem("GameObject/Render into Cubemap")]
	static void RenderCubemap () {
		ScriptableWizard.DisplayWizard<RenderCubemapWizard>(
			"Render cubemap", "Render!");
	}
}

Después creamos GameObject en la escena, y el código asignado para llegar a una interfaz de entrada renderFromPosition barra de menú.
A continuación, crear una textura cubo cubemap (Crear> Legacy> cubemap), con el fin de permitir una escritura suave puede representar imágenes en una textura de cubo, tenemos que comprobar la opción de lectura mecánica.

Utilizando lo anterior medios de código de la ventana de representación de textura obtenidos, que se enfrentan a mayores opciones de tamaño prestados resolución de la textura grande cubo de memoria dedicada y más.

En cuarto lugar, la reflexión

revestimiento reflectante metálico puede ser similar en el mismo sentido, pensando probablemente obtener Reflectancia la dirección de visión y la dirección de la línea normal de la fuente de luz incidente para dar la dirección de la muestra de textura en el cálculo de la correlación en esta dirección.

Shader "Unity Shaders Book/Chapter 10/Reflection" {
	Properties {
		_Color ("Color Tint", Color) = (1, 1, 1, 1)	
		_ReflectColor ("Reflection Color", Color) = (1, 1, 1, 1)	 //控制反射颜色
		_ReflectAmount ("Reflect Amount", Range(0, 1)) = 1			//控制材质的反射程度
		_Cubemap ("Reflection Cubemap", Cube) = "_Skybox" {}		//环境映射纹理,就是那个cubemap立方体纹理,在材质中进行替换赋值
	}
	SubShader {
		Tags { "RenderType"="Opaque" "Queue"="Geometry"}   //用于不透明的几何物体。。。
		
		Pass { 
			Tags { "LightMode"="ForwardBase" }
			
			CGPROGRAM
			
			#pragma multi_compile_fwdbase
			
			#pragma vertex vert
			#pragma fragment frag
			
			#include "Lighting.cginc"
			#include "AutoLight.cginc"
			
			fixed4 _Color;
			fixed4 _ReflectColor;
			fixed _ReflectAmount;
			samplerCUBE _Cubemap;
			
			struct a2v {
				float4 vertex : POSITION;
				float3 normal : NORMAL;
			};
			
			struct v2f {
				float4 pos : SV_POSITION;
				float3 worldPos : TEXCOORD0;
				fixed3 worldNormal : TEXCOORD1;
				fixed3 worldViewDir : TEXCOORD2;
				fixed3 worldRefl : TEXCOORD3;
				SHADOW_COORDS(4)  //用于衰减和阴影计算,三剑客之一
			};
			
			v2f vert(a2v v) {
				v2f o;
				
				o.pos = UnityObjectToClipPos(v.vertex);
				
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
				
				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				
				o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);
				
				// Compute the reflect dir in world space
				o.worldRefl = reflect(-o.worldViewDir, o.worldNormal); //使用视角方向的反射方向计算光方向
				
				TRANSFER_SHADOW(o); //三剑客之二
				
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
				fixed3 worldNormal = normalize(i.worldNormal);
				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));		
				fixed3 worldViewDir = normalize(i.worldViewDir);		
				
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
				
				fixed3 diffuse = _LightColor0.rgb * _Color.rgb * max(0, dot(worldNormal, worldLightDir));
				
				// Use the reflect dir in world space to access the cubemap
				fixed3 reflection = texCUBE(_Cubemap, i.worldRefl).rgb * _ReflectColor.rgb; //这里i.worldRefl不需要及逆行归一化,因为只取方向
				
				UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);  //统一管理那个,算是三剑客之三。。
				
				// Mix the diffuse color with the reflected color
				fixed3 color = ambient + lerp(diffuse, reflection, _ReflectAmount) * atten; //这里使用_ReflectAmount进行取值(混合漫发射颜色和反射颜色)
				
				return fixed4(color, 1.0);
			}
			
			ENDCG
		}
	}
	FallBack "Reflective/VertexLit"
}

Luego, después de cubemap textura cúbica en nuestro conjunto de material de sombreado en la reflexión cubemap.

En quinto lugar, la refracción

La refracción es otra aplicación común para un mapa ambiental.

------- ley de refracción de Snell para calcular el ángulo de reflexión ------ n1 sinθ1 = n2 sinθ2, (el ángulo es el ángulo a la normal; n1, n2 es el índice de refracción de los dos medios, 1 es un vacío el vidrio es 1,5)

Shader "Unity Shaders Book/Chapter 10/Refraction" {
	Properties {
		_Color ("Color Tint", Color) = (1, 1, 1, 1)
		_RefractColor ("Refraction Color", Color) = (1, 1, 1, 1)   //折射颜色设置
		_RefractAmount ("Refraction Amount", Range(0, 1)) = 1     //透射程度
		_RefractRatio ("Refraction Ratio", Range(0.1, 1)) = 0.5   //透射比
		_Cubemap ("Refraction Cubemap", Cube) = "_Skybox" {}	//立方体纹理
	}
	SubShader {
		Tags { "RenderType"="Opaque" "Queue"="Geometry"}  //用于不透明的几何物体。。。
		
		Pass { 
			Tags { "LightMode"="ForwardBase" }
		
			CGPROGRAM
			
			#pragma multi_compile_fwdbase	
			
			#pragma vertex vert
			#pragma fragment frag
			
			#include "Lighting.cginc"
			#include "AutoLight.cginc"
			
			fixed4 _Color;
			fixed4 _RefractColor;
			float _RefractAmount;
			fixed _RefractRatio;
			samplerCUBE _Cubemap;
			
			struct a2v {
				float4 vertex : POSITION;
				float3 normal : NORMAL;
			};
			
			struct v2f {
				float4 pos : SV_POSITION;
				float3 worldPos : TEXCOORD0;
				fixed3 worldNormal : TEXCOORD1;
				fixed3 worldViewDir : TEXCOORD2;
				fixed3 worldRefr : TEXCOORD3;
				SHADOW_COORDS(4)
			};
			
			v2f vert(a2v v) {
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);		
				
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
				
				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				
				o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);
				
				// Compute the refract dir in world space
				o.worldRefr = refract(-normalize(o.worldViewDir), normalize(o.worldNormal), _RefractRatio); 
				//计算折射方向(第一个参数入射光线方向,第二个是表面法线,这两个都要归一化,第三个参数是入射光线所在介质的折射率和折射光线所在介质的折射率的比值)
				
				TRANSFER_SHADOW(o);
				
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
				fixed3 worldNormal = normalize(i.worldNormal);
				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
				fixed3 worldViewDir = normalize(i.worldViewDir);
								
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
				
				fixed3 diffuse = _LightColor0.rgb * _Color.rgb * max(0, dot(worldNormal, worldLightDir));
				
				// Use the refract dir in world space to access the cubemap
				fixed3 refraction = texCUBE(_Cubemap, i.worldRefr).rgb * _RefractColor.rgb;  //使用折射方向对立方体纹理进行采样获取折射颜色
				
				UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
				
				// Mix the diffuse color with the refract color
				fixed3 color = ambient + lerp(diffuse, refraction, _RefractAmount) * atten;  //使用_RefractAmount透射程度对漫反射和折射颜色进行混合取值
				
				return fixed4(color, 1.0);
			}
			
			ENDCG
		}
	} 
	FallBack "Reflective/VertexLit"
}

Luego, después de cubemap textura cúbica en nuestro conjunto de material de sombreado en la refracción cubemap en (el libro y hhh equivocadas ~).

En sexto lugar, la reflexión de Fresnel

Reflexión de Fresnel puede ser controlada de acuerdo con el grado de direcciones de visión de reflexión, que puede generar un fenómeno óptico
(ejemplo fenómeno: de pie lago, el pie del agua es casi transparente, y la distancia sólo puede ver el fenómeno de reflexión de superficie)
que, cuando la luz cuando se irradian a la superficie del objeto, una parte de la parte refractada se refleja o dispersa, existe una cierta relación entre la reflexión y refracción de la luz, que es por la relación entre la ecuación Fresnel calculado.

ecuación Fresnel : F (v, n) = F0 + (1-F0) [(1-v · n) º 5]

El uso de este puede variar en el límite entre el análogo y la intensidad de la luz refractada de la intensidad de luz reflejada / reflejada de forma difusa, en muchos pintura y otros materiales en el agua, se utiliza a menudo.

Shader "Unity Shaders Book/Chapter 10/Fresnel" {
	Properties {
		_Color ("Color Tint", Color) = (1, 1, 1, 1)
		_FresnelScale ("Fresnel Scale", Range(0, 1)) = 0.5    //调整影响大小的
		_Cubemap ("Reflection Cubemap", Cube) = "_Skybox" {}
	}
	SubShader {
		Tags { "RenderType"="Opaque" "Queue"="Geometry"}
		
		Pass { 
			Tags { "LightMode"="ForwardBase" }
		
			CGPROGRAM
			
			#pragma multi_compile_fwdbase
			
			#pragma vertex vert
			#pragma fragment frag
			
			#include "Lighting.cginc"
			#include "AutoLight.cginc"
			
			fixed4 _Color;
			fixed _FresnelScale;
			samplerCUBE _Cubemap;
			
			struct a2v {
				float4 vertex : POSITION;
				float3 normal : NORMAL;
			};
			
			struct v2f {
				float4 pos : SV_POSITION;
				float3 worldPos : TEXCOORD0;
  				fixed3 worldNormal : TEXCOORD1;
  				fixed3 worldViewDir : TEXCOORD2;
  				fixed3 worldRefl : TEXCOORD3;
 	 			SHADOW_COORDS(4)
			};
			
			v2f vert(a2v v) {
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
				
				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				
				o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);
				
				o.worldRefl = reflect(-o.worldViewDir, o.worldNormal);   //求出反射方向
				
				TRANSFER_SHADOW(o);
				
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
				fixed3 worldNormal = normalize(i.worldNormal);
				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
				fixed3 worldViewDir = normalize(i.worldViewDir);
				
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
				
				UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
				
				fixed3 reflection = texCUBE(_Cubemap, i.worldRefl).rgb;   //使用反射方向采样
				
				fixed fresnel = _FresnelScale + (1 - _FresnelScale) * pow(1 - dot(worldViewDir, worldNormal), 5);   //计算菲涅尔反射公式。
				
				fixed3 diffuse = _LightColor0.rgb * _Color.rgb * max(0, dot(worldNormal, worldLightDir));
				
				fixed3 color = ambient + lerp(diffuse, reflection, saturate(fresnel)) * atten;  //使用菲涅尔公式计算出的fresnel对漫反射和反射进行混合取值
				
				return fixed4(color, 1.0);
			}
			
			ENDCG
		}
	} 
	FallBack "Reflective/VertexLit"

Algunos también logrado reflexión de la luz directamente fresnel y reflexión difusa multiplicando superponen a la luz, los efectos de iluminación borde analógicas.

La reflexión difusa objeto de Fresnel La escala es 0, es una luz que tiene un efecto de borde, es 1, la imagen se refleja totalmente en la textura cubo.

Publicado 38 artículos originales · ganado elogios 6 · vistas 4094

Supongo que te gusta

Origin blog.csdn.net/w9503/article/details/104848041
Recomendado
Clasificación