在unity中倔毙,一般都是用Cg語言編寫頂點片元著色器冻璃,或者直接使用表面著色器侮穿,這兩者的編寫語言都是Cg歌径,除了Cg外,我們還可以使用OpenGL編寫亲茅。
用Cg編寫的方式稱為HLSL回铛,用OpenGL編寫的方式稱為GLSL。
那么克锣,我們習慣上使用Cg茵肃,也就是HLSL在unity中編寫shader,但偶爾換個口味也是可以的袭祟。
這里介紹的就是使用GLSL編寫shader验残。
當然,這里介紹的只是語法結(jié)構(gòu)巾乳,并不是涉及很多您没,而我本身也不是很擅長去編寫這類shader。
通過這個語法結(jié)構(gòu)胆绊,我們可以將一些用OpenGL編寫的著色器拿到unity中使用氨鹏。
OK,直接來看一下代碼:
簡單的改變顏色shader代碼
Shader "LearnShader/GLSL/GLSLTest"{
Properties{
_Color("Color",Color) = (1,1,1,1)
}
SubShader{
Tags{
"Queue" = "Geometry"
"RenderType" = "Opaque"
"PreviewType" = "Plane"
}
Pass{
GLSLPROGRAM
#ifdef VERTEX
void main(){
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
#endif
#ifdef FRAGMENT
uniform vec4 _Color;
void main(){
gl_FragColor = _Color;
}
#endif
ENDGLSL
}
}
}
OK压状,如果你直接把這段代碼拷貝進unity中的話會報錯的仆抵。
在編寫shader之間,我們需要對unity做一點點改變,使其支持GLSL編寫shader镣丑。
找到桌面上的unity快捷方式鍵还栓,右鍵,打開屬性面板传轰,如下圖:
在目標那一欄中剩盒,最后面添加:-force-opengl
如果你的unity是打開的,那么就關閉重啟一下慨蛙。
然后就是正常的創(chuàng)建shader代碼辽聊,然后將上述代碼寫好,保存即可期贫。
需要我們注意的是:
- 如果你想通過inspector面板調(diào)節(jié)shader屬性跟匆,那么除了在Properties塊中定義屬性外,在Pass塊中定義屬性需要在其類型前面加上 uniform 關鍵字通砍。
- GLSL的代碼段是被包括在 GLSLPROGRAM 與ENDGLSL之間玛臂。
- 頂點與片元著色器,都是通過 #ifdef 與 #endif 加上 VERTEX 與 FRAGMENT 關鍵字確定的封孙。
- 頂點與片元著色器中的類似gl_Position等是OpenGL中的語法迹冤。
以上就是關于使用GLSL編寫shader的語法結(jié)構(gòu)。
最后給出一個比較有意思的shader虎忌,也是使用GLSL編寫的泡徙。
代碼如下:
Shader "LearnShader/GLSL/GLSLTest"{
Properties{
_MainTex("Base(RGB)",2D) = "white"{}
}
SubShader{
Tags{"RenderType" = "Opaque" "Queue" = "Geometry"}
Pass{
GLSLPROGRAM
#ifdef VERTEX
void main(){
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
#endif
#ifdef FRAGMENT
uniform sampler2D _MainTex;
const float size = 0.5;
void main(){
vec2 realSize = vec2(textureSize(_MainTex, 0));
float ratio = (realSize.x > realSize.y) ?
realSize.y/realSize.x : realSize.x/realSize.y;
vec2 texSize = vec2(512., 512.);
vec2 xy = gl_FragCoord.xy;
if(realSize.x > realSize.y) {
xy.x = xy.x * ratio;
}
else
![Animation.gif](http://upload-images.jianshu.io/upload_images/5301156-17a2bc8700542539.gif?imageMogr2/auto-orient/strip)
{
xy.y = xy.y * ratio;
}
vec2 center = vec2(texSize/2.);
float maxV = dot(center, center);
float minV = floor(maxV*(1. - size));
float diff = maxV - minV;
vec2 uv = xy / texSize;
vec4 srcColor = texture2D(_MainTex, uv);
float dx = center.x - xy.x;
float dy = center.y - xy.y;
float dstSq = pow(dx, 2.) + pow(dy, 2.);
float v = (dstSq / diff);
float r = clamp(srcColor.r + v, 0., 1.);
float g = clamp(srcColor.g + v, 0., 1.);
float b = clamp(srcColor.b + v, 0., 1.);
gl_FragColor = vec4( r, g, b, 1.0 );
}
#endif
ENDGLSL
}
}
}