美文网首页Unity3D 成神之路ShaderUnity Shader分享
Shander编程(一)使用结构体编写一个简单的Shader

Shander编程(一)使用结构体编写一个简单的Shader

作者: _凉笙 | 来源:发表于2017-08-07 18:58 被阅读50次

    Mesh Filter : 存储一个Mesh(网格,模型的网格,就是模型的由哪些三角面组成,组成一个什么样子的模型,三角面的一些顶点信息)
    Mesh Renderer:用来渲染一个模型的外观,就是样子, 按照 mesh给它皮肤,给它颜色
    通过Material(材质)控制模型渲染的样子

    Material贴图(可以没有,可以是一个单纯的颜色)
    
        Shader书籍
    unity shader 入门精要(乐乐程序猿)
    unity 3d shaderlab开发实战详解(第二版)
    unity 5.x shaders and effects cookbook(中文版 unity着色器和屏幕特效开发秘籍)
    

    CG语言教程官网
    http://http.developer.nvidia.com/CgTutorial/cg_tutorial_frontmatter.html

    一些网站
    www.shadertoy.com
    http://blog.csdn.net/poem_qianmo?viewmode=contents

    数学函数在线演示
    http://zh.numberempire.com/graphingcalculator.php

    UnityCG.cginc中一些常用的函数

    //摄像机方向(视角方向)
    float3 WorldSpaceViewDir(float4 v)      根据模型空间中的顶点坐标 得到 (世界空间)从这个点到摄像机的观察方向
    float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标==》世界空间从这个点到摄像机的观察方向
    float3 ObjSpaceViewDir(float4 v)        模型空间中的顶点坐标==》模型空间从这个点到摄像机的观察方向
    //光源方向
    float3 WorldSpaceLightDir(float4 v)     模型空间中的顶点坐标==》世界空间中从这个点到光源的方向
    float3 UnityWorldSpaceLightDir(float4 v)    世界空间中的顶点坐标==》世界空间中从这个点到光源的方向
    float3 ObjSpaceLightDir(float4 v)   模型空间中的顶点坐标==》模型空间中从这个点到光源的方向
    //方向转换
    float3 UnityObjectToWorldNormal(float3 norm) 把法线方向 模型空间==》世界空间
    float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空间=》世界空间
    float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空间=》模型空间
    

    什么是OpenGL、DirectX
    shader可以认为是一种渲染命令 ,由opengl 或者dx进行解析,来控制渲染丰富多彩的图形

    OpenGL 使用GLSL 编写shader
    DirectX 使用HSSL 编写shader
    英伟达 CG 编写shader(跨平台)

    Unity Shader的分类
    使用的是ShaderLab编写Unity中的Shader
    1,表面着色器 Surface Shader
    2,顶点/片元着色器 Vertex/Fragment Shader
    3,固定函数着色器 Fixed Function Shader

    Unityshader中属性的类型有哪些
    _Color("Color",Color)=(1,1,1,1)
    _Vector("Vector",Vector)=(1,2,3,4)
    _Int("Int",Int)= 34234
    _Float("Float",Float) = 4.5
    _Range("Range",Range(1,11))=6
    _2D("Texture",2D) = "red"{}
    _Cube("Cube",Cube) = "white"{}
    _3D("Texure",3D) = "black"{}

    从应用程序传递到顶点函数的语义有哪些a2v
    POSITION 顶点坐标(模型空间下的)
    NORMAL 法线( 模型空间下)
    TANGENT 切线(模型空间)
    TEXCOORD0 ~n 纹理坐标
    COLOR 顶点颜色

    从顶点函数传递给片元函数的时候可以使用的语义
    SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用)
    COLOR0 可以传递一组值 4个
    COLOR1 可以传递一组值 4个
    TEXCOORD0~7 传递纹理坐标

    片元函数传递给系统
    SV_Target 颜色值,显示到屏幕上的颜色

    shader中的各种空间坐标
    http://blog.csdn.net/lyh916/article/details/50906272
    什么是切线空间
    http://blog.csdn.net/bonchoix/article/details/8619624

    pixel = (normal+1)/2

    normal = pixel*2 - 1

    第一个Shader的编写
    Shader"Use Struct"{
        properties{
            //在这里编写属性
            _Color("Color",Color) = (1,1,1,1)
        }
    
            //SubShader可以写多个,显卡运行效果的时候,从第一个SubShader开始,
            //如果第一个SubShader里面的效果都可以实现那就使用第一个SubShader,如果显卡发现这个SubShader里面效果它实现不了,
            //那它会去运行下一个SubShader
            SubShader{
            //这里编写的是渲染的代码控制渲染的效果,不同的SubShader实现不同的渲染效果
            Pass {//至少有一个Pass块
                  //在这里编写Shader代码
            CGPROGRAM
            //使用CG语言编写Shader代码
    
    
                //顶点函数  这里只是申明了顶点函数的函数名
                //基本作用是 完成顶点坐标从模型空间到剪裁空间的转换(从游戏环境转换到视野相机屏幕上)
    #pragma vertex vert
    
                //片元函数  这里只是申明了片元函数的函数名
                //基本作用 返回模型对应的屏幕上的每一个像素的颜色值
    #pragma fragment frag
    
    
            //appllcation to vertex
            //a2v 从应用程序传递到顶点的函数的语义
            //POSITION:顶点坐标(模型空间下的)
            //NORMAL:法线(模型空间下)
            //TANGENT:切线(模型空间下)
            //TEXCOORD0~7 纹理坐标
            //COLOR 顶点颜色
                //结构体
                struct a2v {
                   float4 vertex:POSITION;//告诉unity 把模型空间下的顶点坐标填充给vertex;
                   float3 normal:NORMAL;//告诉unity把模型空间下的法线方向填充给normal;
                   float4 texcoord:TEXCOORD0;//告诉unity把第一套纹理坐标填充给texcoord;
                  };
    
         //从顶点函数传递给片元函数的时候可以使用的语义
        //SV_POSITION  剪裁空间中的顶点坐标(一般是系统直接使用)
        //COLOR0 可以传递一组值 4个
       //COLOR1 可以传递一组值 4个
       //TEXCOORD0~7 传递纹理坐标
            struct v2f {
                //SV_POSITION:这个语义是用来解释说明返回值,意思是返回值是剪裁空间下的顶点坐标
                float4 position:SV_POSITION;
                float3 temp:Color0;//Color0 这个语义可以由用户定义,一般都存储颜色 可以做数据的传递
            }; 
    
    
            //
            v2f vert(a2v v) {
                    v2f f;
                    //这是把一个坐标跟一个矩阵相乘,使用一个宏,这是一个4*4的矩阵,这个矩阵是专门完成从模型空间到剪裁空间的转换的
                    f.position = mul(UNITY_MATRIX_MVP, v.vertex);//矩阵的作用就是完成一个空间转换的过程
                    f.temp = v.normal;
                    return f;
                }
            //片元函数传递给系统
            //SV_Target 颜色值,显示到屏幕上的颜色
            fixed4 frag(v2f f) :SV_Target{
                return fixed4(f.temp,1);
            }
    
                ENDCG
           }
        }
            Fallback"VertexLit"//备用,当前面的SubShader都无法使用的时候会调用这个
    }
    
    Paste_Image.png

    相关文章

      网友评论

        本文标题:Shander编程(一)使用结构体编写一个简单的Shader

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