最近学了很多关于图形学的知识,寻思着通过写文章的方式整理一下知识结构,同时又可以加深一下对所学知识的理解,所以就有了写一个GLSL in Unity系列文章的想法。
众所周知,Unity shader 支持三种shader语言:Cg、HLSL以及GLSL,Cg全称C for graphic用的是最多的,是由NVIDIA 和微软联合开发,HLSL全称High Level Shader Language(高阶着色器语言),由微软推出在DirectX上运行,GLSL全称OpenGL Shading Language,是专门面向OpenGL编程的着色编程的语言,无论你在Unity中编写哪种Shader语言,在程序发布的时候Unity都会通过HLSLcc编译器编译成目标平台的着色器代码,更多关于Unity跨平台的可以参考下面的链接:
Unity3D的Shader编译流程
实际上GLSL在Unity上并不是常用的shader 语言,Cg是最受欢迎的,因为语法几何与c一致,开发和阅读都会容易很多,我这里选择使用GLSL是因为最近学习了一些关于WebGL的知识,Three.js和Bobylon.js都是基于WebGL封装的比较好的Web 3D引擎,而WebGL又是基于OpenGL ES,所以WebGL中也是使用的GLSL。近年来,AR,VR的发展,使得3D应用需求越来越多,而随着5G的到来,Web 3D的发展应该是越来越好,学好了GLSL,未来就可以左右逢源了。
好了,理论的就说到这里,下面开始同学们最期待的实战环节。
在windows下Graphic APIs默认是不支持OpenGL ES选项的,需要在打开项目时加入-force-opengl 参数
添加OpenGL ES API
选择OpenGLES3 API
下面开始代码,在Unity中创建Shader文件,打开shader文件,修改如下:
Shader "GLSL/GLSL basic shader" { // defines the name of the shader
SubShader {
Pass {
GLSLPROGRAM // here begins the part in Unity's GLSL
#ifdef VERTEX // here begins the vertex shader
void main() // all vertex shaders define a main() function
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
#endif // here ends the definition of the vertex shader
#ifdef FRAGMENT // here begins the fragment shader
void main() // all fragment shaders define a main() function
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
#endif // here ends the definition of the fragment shader
ENDGLSL // here ends the part in GLSL
}
}
// FallBack "Diffuse"
}
GLSL代码要写在GLSLPROGRAM 和ENDGLSL 之间,顶点函数和片段函数需要使用宏命令区分开来,分别为:#ifdef VERTEX和#ifdef FRAGMENT。
内置变量 | 作用 |
---|---|
gl_ModelViewProjectionMatrix | 内置的MVP转化矩阵 |
gl_Vertex | 对象空间中顶点坐标 |
gl_Position | 传到渲染流水线下阶段的裁剪空间的坐标 |
gl_FragColor | 最终的颜色 |
然后创建材质球,将刚刚编写的shader赋予材质球,在场景中新建一个cube,将cube的材质替换为刚刚创建的材质球,效果如下:
第一个Unity GLSL程序
好了,今天的文章就到这里。
网友评论