Unity3D ShaderLab 简单的立方体图反射

Unity3D ShaderLab 简单的立方体图反射

 

反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境,

让着色器反射外界的场景信息并将他们反射到材质表面来模拟外部环境,所以我们会使用立方图【CubeMap】的6张纹理来模拟环境的色彩情况。

首先,创建Shader,创建材质球,准备立方图,双击Shader,进入代码编辑器。

Properties CGPROGRAM,再到surf,本次功能较为简单,先看代码。

 code start -----------------------------------------------------------------------

Shader "91YGame/Cube1" {

Properties {

_MainTint("Diffuse Tint",Color)=(1,1,1,1)

_MainTex ("Base (RGB)", 2D) = "white" {}

_CubeMap("CubeMap",CUBE)=""{}

_ReflAmount("Reflection Amount",Range(0.1,3))=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"

}

 

code end ------------------------------------------------------------------------

 

通过上面的简单修改,我们也获得了简单的里繁体反射效果,在Unity中可以直接查看效果。

 技术分享

总结看来,着色器对立方图进行采样,并得到一个类似真实的反射。

这要归功于Unity在表面着色器的Input结构体中内置的worldRefl属性,他为我们直接提供了必要的反射向量,

帮助我们的立方图进行正确采样。我们只需要在texCube函数中使用worldRefl变量,即可得到正确的反射图。

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。