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

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 = UnityObjectToClipPos(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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容