美文网首页UnityShader
GLSL in Unity 系列文章(一):第一个Unity G

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

作者: 雄关漫道从头越 | 来源:发表于2020-08-17 00:51 被阅读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程序

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/skcfjktx.html