zoukankan      html  css  js  c++  java
  • Unity Shader 基本类型和结构

    最近看了siki老师的shader教程,感谢siki老师,讲课真好。之前看了一些Shader的书,因为没有图形学的基础,所以看的挺痛苦的。然后看了siki老师的视频后,结合以前看的书一下子明了了。

    在这里我写下笔记和视频的代码,方便自己以后查看。

    在这篇文章里主要介绍了Unity Shader的基本类型和内置的两个方法。代码里有很多注释了,如果想更深入地学习的话建议去看siki老师的视频,讲得非常明白。在这里就不啰唆了。

    //这里指定shader的名字,不要求跟文件名保持一致
    Shader "TMoon/01-Basic Shader" {
        // 属性  类似C#的属性,可以在面板复制修改
        Properties{
            // 属性名字("面板显示的名字",属性的类型) = (属性的默认值)
            // 这里基本例举了Shader所有的属性(类型)
            _Color("Color",Color) = (1,1,1,1) // float类型
            _Vector("Vector",Vector) = (1,2,3,4) // float类型
            _Int("Int",Int) = 1234 // float类型
            _Float("Float",Float) = 1.2 // float类型
            _Range("Range",Range(1,11)) = 6 // float类型
            _2D("Texture",2D) = "red" {} // sampler2D类型
            _3D("Texture",3D) = "black"{} // sampler3D类型
            _Cube("Cube",Cube) = "white"{} // samplerCUBE类型  例子:天空盒子,6个面
        }
    
        //SubShader可以写很多个 显卡运行效果的时候,从第一个SubShader开始
        //如果第一个SubShader里面的效果都可以实现,那么就使用第一个SubShader,
        //如果显卡这个SubShader里面某些效果它实现不了,它会自动去运行下一个SubShader
        SubShader{
            //类似Unity的MonoBehaviour,Shader所有的代码放在Pass里执行
            //所以至少有一个Pass
            Pass{
                //在这里编写Shader代码
                CGPROGRAM
    
                // Properties的值需要在这里再声明一次才可以Shader里使用
                // 这里有个细节,类似C#的int float double类型,他们精度不一样
                // Shader里也有关于数字的精度不一样的类型,分别是float half fixed
                // float 32位 half 16位  fixed 11位(-2到+2)
                // 所以关于颜色可以用fixed来存储
                fixed4 _Color;
                float4 _Vector;
                float _Int;
                float _Float;
                half _Range;
                sampler2D _2D;
                sampler3D _3D;
                samplerCUBE _Cube;
    
                // 类似MonoBehaviour的Start Update这些内置方法
                // 只不过Shader可以让我们自定义这些方法参数,返回值,方法名。
                // vertex声明顶点函数 vert为函数名
                // 顶点函数的基本作用:完成顶点坐标从模型空间到剪裁空间的转换(从游戏环境转换到视野相机屏幕上)
                // 调用时机:模型上拥有多少顶点就调用多少次
                #pragma vertex vert
    
                // fragment声明片元函数 frag为函数名
                // 片元函数基本作用:返回模型对应的屏幕上的每一个像素的颜色值(显示模型)
                // 调用时机:模型上拥有多少像素就调用多少次,所以调用次数和细节大于顶点函数
                #pragma fragment frag
    
                //一般参数传值方式(比较直接)  后面介绍利用结构体去传值
    
                //通过语义告诉系统,我这个参数是干嘛的
                //比如POSITION是告诉系统我需要自动传入模型的顶点坐标
                //SV_POSITION这个语义用来解释说明返回值, 意思是返回值是剪裁空间下的顶点坐标
                float4 vert(float4 v : POSITION) : SV_POSITION{
                    //通过矩阵变换将模型顶点坐标变换到裁剪空间(线性代数的知识,或者记住矩阵的作用一般用于变换坐标)
                    return mul(UNITY_MATRIX_MVP,v);
                }
    
                float4 frag() : SV_Target{
                    // 返回模型每个像素的颜色值
                    return fixed4(0.5,0.5,1,1);
                }
    
                ENDCG
            }
        }
    
        // 如果所有的SubShader都失败则使用VertexLit 这里是系统默认的
        Fallback "VertexLit"
    }
    01-Basic Shader

     Shader的编写基本可以按照这个结构来填充。

  • 相关阅读:
    洛谷 P1194 飞扬的小鸟 题解
    洛谷 P1197 星球大战 题解
    洛谷 P1879 玉米田Corn Fields 题解
    洛谷 P2796 Facer的程序 题解
    洛谷 P2398 GCD SUM 题解
    洛谷 P2051 中国象棋 题解
    洛谷 P1472 奶牛家谱 Cow Pedigrees 题解
    洛谷 P1004 方格取数 题解
    洛谷 P2331 最大子矩阵 题解
    洛谷 P1073 最优贸易 题解
  • 原文地址:https://www.cnblogs.com/SeaSwallow/p/6893418.html
Copyright © 2011-2022 走看看