Unity Shader入门教程(一)

转载链接如下:https://www.cnblogs.com/JackSamuel/tag/%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/

Unity Shader是着色器,将纹理、网格信息输入,得到材质的一段程序,具体是个什么东西,还需要亲自实践才知道。一个Unity大神推荐我:如果要学计算机图形编程(游戏编程的基础),可以先学习UnityShader,往后再学习OpenGL和DX。不说废话,依我的风格,都是直接看实例,笔者的教程偏向于傻瓜式的,应该适合入门。

第一步:打开新工程。在内容浏览器中创建一个Shader。

Shader "Custom/Shad0" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 当然,你一开始看不懂,请逐行逐行看我的解释,下文中的代码和上文中的一样,只是加入了详细的注释:

/*首行声明了一个Shader,命名为Shad0,存放在路径Custom下(这个路径在哪里不是重点,它归类在自定义中),看上去是不是挺像结构体的声明*/
Shader "Custom/Shad0" {

    /*
    在将第一块内容之前,请先去了解一下UV纹理。简单来说:A是一张图片(称A为纹理),B是一张坐标信息(称B为UV),用B来取A就是纹理贴图的精髓了,举个简单的例子:
    A的色彩如下:
    红 黄
    蓝 绿

    B的坐标信息如下:
    (0,0) (1,1)
    (1,1) (0,1)

    那么取出来得到的纹理贴图就是:
    红 绿
    绿 黄

    这样子,是不是很无聊?当这上面的点数达到很大的量级时,就很有意义了。
    没完,你还需要了解镜面高光和金属度的概念,自行百度(或者先跳过这个知识点继续往下看)。
    */

    /*第一块:属性声明*/
    Properties {

        _Color ("Color", Color) = (1,1,1,1)
        /*用_XX的声明方法来声明的变量就是称为属性了,这一句的语法是:
        _XXX (展示名, 数据类型) = 默认值

        展示名是在Unity中可见的名称,Color其实是一种数据类型(就像int那样,只是后者很简单,是基本数据类型)。
        数据类型有哪些(参考上述博文):
        Color - 一种颜色,由RGBA(红绿蓝和透明度)四个量来定义;
        2D - 一张2的阶数大小(256,512之类)的贴图。这张贴图将在采样后被转为对应基于模型UV的每个像素的颜色,最终被显示出来;
        Rect - 一个非2阶数大小的贴图;
        Cube - 即Cube map texture(立方体纹理),简单说就是6张有联系的2D贴图的组合,主要用来做反射效果(比如天空盒和动态反射),也会被转换为对应点的采样;
        Range(min, max) - 一个介于最小值和最大值之间的浮点数,一般用来当作调整Shader某些特性的参数(比如透明度渲染的截止值可以是从0至1的值等);
        Float - 任意一个浮点数;
        Vector - 一个四维数;

        请看默认值(1,1,1,1),形如(g,b,a,A),其中的透明度A为0时,表示透明,为1时,表示完全不透明,所以应该称之为不透明度。
        */
        
        
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        /*这里表示一张图片,这张图片在这里仅仅用空白来表示*/
    
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        /*高光设置为.5*/

        _Metallic ("Metallic", Range(0,1)) = 0.0
        /*金属度*/
    }


    /*第二块内容:什么是SubShader,如果你用过虚幻4,就能够很容易理解,其实SubShader对应了UE4中的材质表达式。
    UE4中的材质表达式或者Unity中的shader本质是什么?简单来说就是将图片通过处理得到另一张图片(比如用图片+UV信息 -> 纹理贴图的过程)。
    SubShader其实就是定义了图片处理过程。
    */
    SubShader {
        
        /*Tags规定了混合模型。什么是混合模型?请看下面的附图1,当然,混合模型是UE4中的概念。

 

这里贴一段相比Unity更为正确的解释:
        Background - 最早被调用的渲染,用来渲染天空盒或者背景
        Geometry - 这是默认值,用来渲染非透明物体(普通情况下,场景中的绝大多数物体应该是非透明的)
        AlphaTest - 用来渲染经过Alpha Test的像素,单独为AlphaTest设定一个Queue是出于对效率的考虑
        Transparent - 以从后往前的顺序渲染透明物体
        Overlay - 用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等特效)

        */
        Tags { "RenderType"="Opaque" }


        /*LOD表示细节呈现级别(也即是画质,即粗糙/细腻程度)
        当机器很差的时候,差到其评估值小于200时,本材质无效(也就是本shader罢工)。当机器的性能不错,大于200时,本shader继续工作。就是这么有个性。
        别气馁,下面的内容是最重要的。
        */
        LOD 200
        

        /*这是一个标记:CGPROGRAM,表示这是一段computer graph编程*/
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows
            /*请看这个奇怪的函数声明:
            #pragma surface表面着色器 surffunction着色器的代码(在本例子中就是下面的surf) lightModel(光照模型,这个概念先跳过) [可选参数]
            */


        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0


            /*
            用笔者的话来说:sampler2D就是一张图片……(还记得吗,就是上文说的A图片)

            贴一段介绍:
            
            接下来一句sampler2D _MainTex;,sampler2D是个啥?
            其实在CG中,sampler2D就是和texture所绑定的一个数据容器接口。
            等等..这个说法还是太复杂了,简单理解的话,所谓加载以后的texture(贴图)说白了不过是一块内存存储的,
            使用了RGB(也许还有A)通道,且每个通道8bits的数据。而具体地想知道像素与坐标的对应关系,以及获取这些数据,
            我们总不能一次一次去自己计算内存地址或者偏移,因此可以通过sampler2D来对贴图进行操作。
            更简单地理解,sampler2D就是GLSL中的2D贴图的类型,相应的,
            还有sampler1D,sampler3D,samplerCube等等格式。

            解释通了sampler2D是什么之后,
            还需要解释下为什么在这里需要一句对_MainTex的声明,
            之前我们不是已经在Properties里声明过它是贴图了么。
            答案是我们用来实例的这个shader其实是由两个相对独立的块组成的,
            外层的属性声明,回滚等等是Unity可以直接使用和编译的ShaderLab;
            而现在我们是在CGPROGRAM...ENDCG这样一个代码块中,这是一段CG程序。
            对于这段CG程序,要想访问在Properties中所定义的变量的话,必须使用和之前变量相同的名字进行声明!【注意这里!!!】
            于是其实sampler2D _MainTex;做的事情就是再次声明并链接了_MainTex,
            使得接下来的CG程序能够使用这个变量。*/
        sampler2D _MainTex;


        /*这是一个非常简单的结构体,称为Input,其中有一个float2数据类型,这是一个二维float矢量,也就是(a,b)这样的。*/
        struct Input {
            float2 uv_MainTex;
        };

        /*在坚持一下,这里还有几个变量:half类型的两个,fixed4类型的一个,
        half类型表示半精度浮点数,计算性能好但是精度低,和float和double是同类型的浮点数;
        fixed4不详,但是大意是四维的矢量*/
        
        half _Glossiness;//必须使用和之前变量相同的名字进行声明!【注意这里!!!】

        half _Metallic;//必须使用和之前变量相同的名字进行声明!【注意这里!!!】
        
        fixed4 _Color;//必须使用和之前变量相同的名字进行声明!【注意这里!!!】

        /*核心的处理函数:surf,输入一张二维浮点信息,也即是上面的uv_MainTex,
        输出一个o表示材质(inout像c++里面的按照引入传入,虽说没有返回,但是也有信息传出的效果)*/
        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            /*看这里:tex2D就是前面说的"利用UV去取图片获得纹理贴图"的做法,然后再乘以_Color,
            
            这里用到了乘法的颜色算法,自己体会(这个_Color默认值为1,1,1,1,所以默认下不影响)
            笔者到这里可以知道:fixed4表示一种四维矢量(用来表示颜色就挺合适的。此外,它是定点型小数而非浮点型小数)
            */


            o.Albedo = c.rgb;
            /* inout SurfaceOutputStandard o
            这个结构有哪些包含的变量呢:
            struct SurfaceOutput {
                half3 Albedo;     //像素的颜色
                half3 Normal;     //像素的法向值
                half3 Emission;   //像素的发散颜色
                half Specular;    //像素的镜面高光
                half Gloss;       //像素的发光强度
                half Alpha;       //像素的透明度
            };
            */

            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
            /*结束CG编码*/
    }
    FallBack "Diffuse"
        //这里还不太明白,先放着。
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
U3D中ShaderForge插件使用系列教程之一 各位看官好,今天戳戳为大家介绍一个插件。那就是大名鼎鼎的ShaderForge(以下简称SF),这款插件曾获得UNITE14的最佳技术成就奖。请看戳戳为大家截的图。 那么这是一款什么插件呢,这是一款可视化的Shader编辑器。官方宣称能够让艺术家在不写一行代码的前提下创造出Fantastic(请允许戳戳用这个英语单词来形容这种兴奋)ShaderShader可以说是游戏行业的高端领域了,一般人听到Shader的第一感觉是”难“,仅仅从编辑器没有提示来看就可见一斑,还有那略显怪异的语法结构。但戳戳觉得其实编写Shader反而比其他程序更好玩更有意思(各位看官勿喷,戳戳确实有这种感觉),因为戳戳本身并不是计算机程序出身,而是从影视特效转过来的。所以对CG(Computer Graph)有一定的了解。当戳戳第一次看到这款插件时激动的差点哭出来,戳戳之前用的是Houdini(一款非常牛X的特效软件),它内部的材质也是用节点完成的,所以非常习惯这种节点时的软件或插件。自从有了SF,再也不羡慕虚幻引擎的材质编辑器啦(不过说实在的SF和虚幻相比还是有一定的差距)。对于英语水平不错的看官可以直接参考官网的简介和文档(SF官网)。不过英语水平并不是特别厉害的看官也不要着急,在接下来的几篇博文中,戳戳会详细为大家介绍这款插件。 首先给大家展示一张戳戳灰常喜欢的效果图。这个Shader是有动态效果的,还是非常漂亮的,非常具有魔幻效果。
Unity Shader是一种用于渲染图形的程序,它可以控制对象的表面颜色、纹理、透明度、反射等属性,从而实现特殊的视觉效果。对于游戏开发者来说,掌握Shader编写技巧是非常重要的。 以下是关于Unity Shader的入门精要: 1. ShaderLab语言 ShaderLab是Unity中用于编写Shader的语言,它是一种基于标记的语言,类似于HTML。ShaderLab可以用于定义Shader的属性、子着色器、渲染状态等信息。 2. CG语言 CG语言是Unity中用于编写Shader的主要语言,它是一种类似于C语言的语言,可以进行数学运算、向量计算、流程控制等操作。CG语言可以在ShaderLab中嵌入,用于实现Shader的具体逻辑。 3. Unity的渲染管线 Unity的渲染管线包括顶点着色器、片元着色器、几何着色器等组件,每个组件都有不同的作用。顶点着色器用于对对象的顶点进行变换,片元着色器用于计算每个像素的颜色,几何着色器用于处理几何图形的变形和细节等。 4. 模板和纹理 在Shader中,我们可以使用纹理来给对象添加图案或者贴图,也可以使用模板来控制对象的透明度、反射等属性。纹理可以通过内置函数tex2D()来获取,模板可以通过内置函数clip()来实现裁剪。 5. Shader的实现 Shader的实现需要注意以下几点: - 在ShaderLab中定义Shader的属性、子着色器、渲染状态等信息。 - 在CG语言中实现Shader的具体逻辑,包括顶点着色器、片元着色器等内容。 - 使用纹理和模板来实现特定的视觉效果。 - 在对象上应用Shader,通过调整Shader的属性来达到不同的效果。 以上是关于Unity Shader的入门精要,希望对你有所帮助。如果你想更深入地了解Shader的编写技巧,可以参考官方文档或者相关教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值