Shader"Unlit/Specular_Normal"{Properties{_MainTex("Texture",2D)="white"{}_DiffuseColor("Diffuse",Color)=(1,1,1,1)_SpecularColor("Specular",Color)=(1,1,1,1)_gloss("Gloss",Range(0,256))=20_NormalTex("NormalTex",2D)="Bamp"{}_NormalScale("NormalScale",Range(0,1))=1}SubShader{Tag...
1. Shader 属性定义 // 定义属性Properties{_MainTex("MainTex",2D)="white"{}// 主纹理贴图_BumpMap("Normal Map",2D)="bump"{}// 法线贴图_BumpScale("BumpScale",float)=1// 法线贴图的缩放系数_Diffuse("Diffuse",Color)=(1,1,1,1)// 漫反射颜色属性,默认白色_Specular("Specular",Color)=(1...
我们现在来解决第四个问题:为什么在Unity Shaders里,对法线纹理的采样要使用UnpackNormal函数。我们先来看,在用OpenGL这种基本的着色语言时,我们是怎么做的。它的代码一般长成下面这样: // Lookup the normal from the normal map vec4 normal = texture( NormalMapTex, TexCoord ); normal.xyz = normal.xyz * ...
Shader"Custom/13-Rock NormalMap"{ Properties{ _MainTex("Main Tex", 2D) ="white"{}//纹理贴图_Color("Color", Color) = (1,1,1,1)//控制纹理贴图的颜色_NormalMap("Normal Map", 2D) ="bump"{}//表示当该位置没有指定任何法线贴图时,就使用模型顶点自带的法线_BumpScale("Bump Scale", Float...
不管使用哪个坐标系,都面临着一个选择,就是最后光照计算使用的坐标系究竟是哪个。对于Tangent-Space Normal Map,我们一般就是在Tangent Space里计算的,也就是说,我们需要把viewDir、lightDir在Vertex Shader中转换到Tangent Space中,然后在Fragment Shader对法线纹理采样后,直接进行光照计算。
在Unity里,法线纹理是需要把“Texture Type”设置成“Normal Map”才能正确显示,为什么? 把“Texture Type”设置成“Normal Map”后,有一个复选框是“Createfromgrayscale”,这个是做什么用的? 为什么在Unity Shaders里,对法线纹理的采样要使用UnpackNormal函数?直接采样不行么?
下面附上可以直接调整法线强度的shader代码: //Bump Map //by:puppet_master //2017.2.27 Shader "ApcShader/NormalMapX" { //属性 Properties{ _Diffuse("Diffuse", Color) = (1,1,1,1) _MainTex("Base 2D", 2D) = "white"{} _BumpMap("Bump Map", 2D) = "bump"{} ...
答案是,通过这种转换,就可以把Normal Map中的法线转换到对应的物体/世界坐标系下,与这个空间下的光线进行计算,从而能够算出对应此点的正确光照。我们知道Normal Map的法线为什么存储在“切空间”下是有道理的(第一节有提到),但它不能直接被使用。经过这样的转换,就可以与各种可能的空间坐标联系起来了。
Shader "Custom/13-Rock NormalMap" { Properties{ _MainTex("Main Tex", 2D) = "white"{} // 纹理贴图 _Color("Color", Color) = (1,1,1,1) // 控制纹理贴图的颜⾊ _NormalMap("Normal Map", 2D) = "bump"{} // 表⽰当该位置没有指定任何法线贴图时,就使⽤模型顶点⾃带的法线 ...
//归一化法线,即使在vert归一化也不行,从vert到frag阶段有差值处理,传入的法线方向并不是vertex shader直接传出的 fixed3 worldNormal1 = normalize(i.worldNormal); //采样bump贴图,需要知道该点的斜率,xy方向分别求,所以对于一个点需要采样四次 fixed bumpValueU = tex2D(_BumpMap, i.uv + fixed2(-1.0...