GLSL shaders对Mac, iOS和Android平台非常有用.。这篇文章的目的就是告诉大家如何在Unity3D中最小限度地写GLSL shader。在这篇文章中我会展示一个在Unity3D写GLSL shaders的模版,另外还有帮助文档。
GLSL ES 2.0支持两种类型的shader: 顶点着色器(Vertex)和片段着色器(Fragment)。其他类型的着色器都不支持(例如:几何着色器)。顶点着色器会获取到一些输入数据(稍后会详细介绍),而且必须输出的数据中至少要包括gl_Position变量。一个最小限度的顶点着色器代码是这样的:
void main()
{
//在屏幕坐标系中每一个顶点的坐标都将被计算出来( = gl_Position)
//通过做乘积运算,将被乘数顶点在世界坐标系的坐标( = gl_Vertex)
//和乘数MVP矩阵( = gl_ModelViewProjectionMatrix)
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
片段着色器也会获取到一些输入数据,而且必须输出的数据中至少要包括gl_FragColor变量。一个最小限度的片段着色器代码是这样的:
void main()
{
//将对象在屏幕中显示的每个像素值都改成红色的
gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0);
}
想要在Unity shader中运用上面的的GLSL shader代码,那模版的样子就是这样的:
Shader "Shader name"
{
Properties
{
//添加任何变量
}
SubShader
{
Tags { "Queue" = "Geometry" }
Pass
{
GLSLPROGRAM
#ifdef VERTEX
//在这里添加顶点着色器代码
#endif
#ifdef FRAGMENT
//在这里添加片段着色器代码
#endif
ENDGLSL
}
}
}
一个简单的将对象渲染成红色的shader代码:
Shader "simple_Red_Shader"
{
Properties
{
}
SubShader
{
Tags { "Queue" = "Geometry" }
Pass
{
GLSLPROGRAM
#ifdef VERTEX
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
#endif
#ifdef FRAGMENT
void main()
{
gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0);
}
#endif
ENDGLSL
}
}
}
在接下来的文章里,我会展示如何通过Unity脚本创建并访问shader的参数(也就是color, texture等等)和通过UnityCG.glslinc访问Unity内建对象。