Unity3D ShaderLab立方体图的法线渲染

Unity3D ShaderLab立方体图的法线渲染

某些情况下,我们希望立方体图的材质球上产生法线效果,来更多的表现细节,比如菱形花纹的玻璃,冰块的表面。

在帧数的协调下,我们可以通过input结构体的另一个内置参数来传递我们的法线贴图。下面 我们就一步步实现。

首先,新建Shader,在新建材质球,准备立方体图,法线贴图。双击shader进入脚本编辑。

本次的代码修改依然是和之前的立方体图的反射遮罩差不多,所以就直接看完成的代码吧。

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

Shader "91YGame/ReflectionNormal" {

Properties {

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

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

_NormalMap("Normal Map",2D)=""{}

_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;

sampler2D _NormalMap;

samplerCUBE _CubeMap;

float4 _MainTint;

float _ReflAmount;

struct Input {

float2 uv_MainTex;

float2 uv_NormalMap;

float3 worldRefl;

INTERNAL_DATA

};

void surf (Input IN, inout SurfaceOutput o) {

half4 c = tex2D (_MainTex, IN.uv_MainTex);

float3 normals = UnpackNormal(tex2D(_NormalMap,IN.uv_NormalMap)).rgb;

o.Normal = normals;

o.Emission=texCUBE(_CubeMap,WorldReflectionVector(IN,o.Normal) ).rgb*_ReflAmount;

o.Albedo = c.rgb*_MainTint;

o.Alpha = c.a;

}

ENDCG

}

FallBack "Diffuse"

}

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

通过对比变量,我们只是把之前的遮罩贴图换为了发现贴图。但是我们就是想要逐像素的法线贴图来修改我们的反射立方体图效果,

为了实现这一步,必须在法线贴图应用到着色器之后得到物体表面的法线信息,所以我们通过UnpackNormal方法获得法线的rgb信息。

然后再传递给ouput输出结构体的Normal属性。这时候着色器表面的法线就会被修改。因此,我们需要借助它来对我们的反射进行修改,

借助Input结构体进行传递,于是我们用到了内置的INTERNAL_DATA变量来访问修改后的法线。然后再通过WorldReflectionVector(IN,o.Normal)函数来计算游戏场景世界的反射向量,

(WorldReflectionVector)函数中计算每个像素(per-pixel)反射向量(reflection vector)。

这是Unity给我们提供的一种内置函数,方便我们完成功能。最后,我们的效果如下:

左侧是我们刚刚完成的发现贴图效果,中间是上一篇带遮罩的效果。

时间: 2024-09-30 20:55:15

Unity3D ShaderLab立方体图的法线渲染的相关文章

Unity3D ShaderLab 立方体图的菲涅尔反射

Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情况,我们接下来就来实现这种反射效果过. 还是先创建Shader和 Material,沿用上一节的立方体图.代码变动较少,直接看下面的完成代码: code start -------------------------------------------------------------------

Unity3D ShaderLab 立方体图的反射遮罩

Unity3D ShaderLab 立方体图的反射遮罩 上一篇,简单的介绍了立方体图的反射,那么我们能不能使用一张问题对其进行指定遮罩呢?这样美工可以更好的控制图像的效果. 我们接着使用上一篇的shader代码,新建一个材质球,本次修改也是数行代码而已,所以 直接看完成代码. code start -------------------------------------------------------------------- Shader "91YGame/CubeMask" 

Unity3D ShaderLab 简单的立方体图反射

Unity3D ShaderLab 简单的立方体图反射 反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境, 让着色器反射外界的场景信息并将他们反射到材质表面来模拟外部环境,所以我们会使用立方图[CubeMap]的6张纹理来模拟环境的色彩情况. 首先,创建Shader,创建材质球,准备立方图,双击Shader,进入代码编辑器. 从Properties 到CGPROGRAM,再到surf,本次功能较为简单,先看代码. code start

Unity3D ShaderLab法线贴图

Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的多边形数.法线贴图通常存储在一个普通的rgb图片,他的rgb分量分别对应了曲面法线的xyz坐标. 在Unity中,会通过UnpackNormals()函数来使用法线贴图,这使得在表面着色范围内为我们的着色器添加使用法线的过程变得更容易. 首先,创建一个shader和材质球.我们开始修改shader代

Unity3D ShaderLab 使用贴图对模型的高光进行遮罩

Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的方式,我们可以在同一个着色器上实现垫型表面和光亮表面,也可以使用贴图来控制镜面高光的范围或者高光强度, 以实现一个表面是广泛的镜面高光而另一面确是细小的高光. 新建一个shader,一个材质球.老规矩双击shader脚本,在编辑器中编写代码吧. 1.Properties: Properties {

Unity3D 创建动态的立方体图系统

Unity3D 创建动态的立方体图系统 这一篇主要是利用上一篇的Shader,通过脚本来完成一个动态的立方体图变化系统. 准备工作如下: 创建一个新的场景.一个球体.提供给场景一个平行光,准备2个立方体图. 添加两个空对象,并分别命名为Empty1和Empty2,给他们分配不同的位置. 给球体添加一个新的材质,并使用FresnelReflection Shader(上一篇). 最后,创建一个脚本,并命名为CubeDynamic.cs,把它赋给球体. A:下面开始编写脚本: //2个立方体图; p

Unity3D ShaderLab 透明裁剪着色器

Unity3D ShaderLab 透明裁剪着色器 上一篇,我们介绍了使用Alpha实现透明的手法,其实Unity为我们的#pragma提供了另一种参数,是我们能做出更高效 简单的透明效果,也就是裁剪透明. 这种透明使用一个值来简单的控制某些特定的像素无需渲染到屏幕上,所以我们也可以通过他实现一个要么完全透明或完全不透的着色器. 我们即将利用灰度的值来控制材质的透明度. 准备工作还是新建Shader Material,一张灰度变化图.同样是分分钟完成的代码,请看完成: Shader "91YGa

Unity3D ShaderLab 布料着色器

Unity3D ShaderLab布料着色器 布料着色器是我们在虚拟现实中经常使用的着色器.本篇就来完成一个较为简单的布料着色器. 新建Shader,Material,InteractiveCloth[布料].完成的代码如下 Shader "91YGame/ClothShader" { Properties { //参数; _MainTint("Base Color",Color)=(1,1,1,1) _BumpMap ("Normal Map"

Unity3D ShaderLab 各向异性高光

Unity3D ShaderLab 各向异性高光 各向异性时一种模拟物体表面沟槽方向性的高光反射类型,它会修改或延伸垂直方向上的高光.当我们想模拟金属拉丝高光的时候,它非常适合.下面就一步一步实现. 首先创建Shader,再创建材质球.然后双击Shader 打开编辑器. 1:修改Properties Properties { //添加属性; _MainTint("Diffuse Tint",Color)=(1,1,1,1) _MainTex ("Base (RGB)"