您好,登錄后才能下訂單哦!
現(xiàn)在還沒用到cubemap(除了天空盒子),只是初步的學(xué)了一下最簡(jiǎn)單的cubemap的shader
找一幅圖
好吧,有點(diǎn)大,在unity里把它設(shè)置成cubemap
OK,圖有了,看shader,代碼挺簡(jiǎn)單的,其實(shí)和普通的2D貼圖shader挺像
Shader "Custom/Cubemap" {
Properties {
_Cube ("Cubemap", cube) = "" {} //1.
}
SubShader {
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "Lighting.cginc"
samplerCUBE _Cube; //2.
struct v2f {
float4 pos:POSITION;
float3 R:TEXCOORD0;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
float3 L= -_WorldSpaceLightPos0.xyz; //3.
float3 N = UnityObjectToWorldNormal(v.normal);
o.R = reflect(L, N); //4.
return o;
}
fixed4 frag(v2f IN):COLOR
{
fixed4 col = texCUBE(_Cube, IN.R); //5.
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
注意,以上這段代碼是有問題的,后面會(huì)指出問題并改正,先以這段代碼來說明
按照注釋位置
_Cube ("Cubemap", cube) = "" {} //1.
samplerCUBE _Cube; //2.
2D貼圖時(shí),Properties里定義的是2d,而變量聲明時(shí)用的是sampler2D
而對(duì)于cubemap來說則是cube和samplerCUBE
注意:samplerCUBE的CUBE大寫,就像sampler2D的D大寫一樣
先看5
fixed4 col = texCUBE(_Cube, IN.R); //5.
因?yàn)榘凑账鶎W(xué),最后的紋理采樣要用到texCUBE這個(gè)CG函數(shù),其實(shí)看形式和tex2D很像
第一個(gè)參數(shù)就是我們的cubemap那張圖
第二個(gè)參數(shù)則是在vert程序中計(jì)算的一個(gè)世界坐標(biāo)系下的反射向量,float3的
再看4是如何計(jì)算這個(gè)反射的
o.R = reflect(L, N); //4.
反射嗎,當(dāng)然是光和法線,而這個(gè)L,是光的入射,即從光源指向頂點(diǎn)
reflect函數(shù)是計(jì)算反射向量的
所以看3
float3 L= -_WorldSpaceLightPos0.xyz; //3.
以前用到這個(gè)世界坐標(biāo)空間下的光方向_WorldSpaceLightPos0.xyz,這個(gè)是從頂點(diǎn)指向光源的方向,現(xiàn)在正好相反,所以取負(fù)
貌似OK了,我們看看結(jié)果,在場(chǎng)景中建一個(gè)球體,把這個(gè)材質(zhì)賦給它,并轉(zhuǎn)動(dòng)視角
其實(shí)也不能說錯(cuò)了,如果就是要這個(gè)效果的話
用光與法線算出來的反射,因?yàn)楣馐瞧叫泄夤潭ǖ模旤c(diǎn)法線也是固定的,反射也是固定的
所以算出來的顏色是固定,就有了這個(gè)效果
但如果想實(shí)現(xiàn)的是像鏡面那種效果的話,隨著視角的不同,看到的東西并不相同,代碼就要做些修改了
既然是隨視角變化,那是不是認(rèn)為不要用光的方向而是用視方向
我們把注釋的3和4改一下
float3 V = -WorldSpaceViewDir(v.vertex); //3.
o.R = reflect(V, N); //4.
這里用了視方向,同樣是從眼睛指向頂點(diǎn),所以也取負(fù)
再用reflect函數(shù)
看下效果
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。