UnityShader

GLSL in Unity 系列文章(一):第一个Unity G

2020-08-17  本文已影响0人  雄关漫道从头越

最近学了很多关于图形学的知识,寻思着通过写文章的方式整理一下知识结构,同时又可以加深一下对所学知识的理解,所以就有了写一个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编译流程

跨平台引擎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程序

好了,今天的文章就到这里。

上一篇下一篇

猜你喜欢

热点阅读