UnityShader的学习记录一:Shader的基本结构

起因:

因为初学Shader时遇到了很多问题,为此看了不少视频,也看过不少博客文章。写这系列文章一来思考总结,二来希望能给后来的学习者一点帮助。文末会列出参考的网站和博客,如果文中有错误,还希望有高手指点一二。

正文

  1. shader的分类:

1.表面着色器
2.顶点/片元着色器
3.固定渲染管线着色器
第三个主要用于老式的GPU,所以现在主要学习前两个。

2.shader的基本结构


Shader基本结构.png

3.在看一个简单的shader脚本
在Unity里新建一个Shader,默认的第一个就可以了;双击打开。
默认创建的是表面着色器,大家对着代码图片修改一下,下面我会一一解释。

表面着色器的代码样式.png

第1行:指定Shader的路径和名字
第3-6行:定义着色器的属性,作为输入提供给所有子着色器并在材质球上作为可调参数显示出来。每一条属性的定义的语法如下:

_Name("Display Name", type) = defaultValue[{options}]
属性名   面板显示的名字   属性类型   属性的默认值  可选选项

关于属性的解释,猫大已经写的很好了,请看这里
第8行:这里的标签表示 在系统渲染非透明物体时调用此子着色器。子着色器和Pass可以被若干的标签(tags)所修饰,而硬件将通过判定这些标签来决定什么时候调用该子着色器和Pass。对于SubShader里的标签和Pass里的标签有不同的语法。请参照Unity官方文档:SubShaderTagsPassTags
第9行:LOD其实就是根据设备性能的不同编译不同版本的Shader(网上找到的解释是如此,但是感觉不是那么回事)
第10行和第22行:开始标记和结束标记,表明开始和结束标记之间是一段CG程序。
第11行:编译指令,这个指令声明了我们要写一个表面Shader,并且指定了了光照模型。指令的写法如下:

#pragma surface surf lightModel [optionalparams]
surface-声明这是一个表面着色器
surf-此着色器的函数名
lightModel-使用的光照模型
optionalparams-可选参数

第12行:两个知识点,首先讲第一个;fixed4和编程语言里的int float差不多,都是向系统请求从内存中开辟出一个位置用来存储数据。第二个,为什么在properties{}里面已经声明初始化了但还要在CG程序中再声明一遍,因为properties和SubShader是两个不同的模块,如果想在CG程序中访问在Properties中所定义的变量的话,必须使用和之前变量相同的名字进行声明,才能与Properties的变量进行连接。
第13行到第16行:定义了一个结构体,把一会需要传给surf函数进行计算的数据放到里面,这个脚本中的这个结构体没有任何作用,但是系统又强制要求我们必须要在表面着色器的编写中有一个Input结构体,所以必须要写一个,否则会报错。
第17行到第21行:这就是我们之前声明过的函数了,surf;他有两个参数即输入的数据IN和输出的数据o;这个函数的作用就是,对输入进来的数据进行一定的处理,然后在进行输出。在本代码中,我们并没有使用输入参数,而是直接把之前在properties声明的_Color属性赋值给输出参数。输入参数是结构体,输出参数当然也是结构体,文末会贴出一张图片,大家可以对着图片上的输入输出结构体来推测函数里的这两个语句所做的操作。
第22行:CG程序结束标记
第24行:这行语句的作用是告诉系统,如果上面的子着色器都没法调用的话,则调用unity内置的着色器Diffuse进行渲染。
注:如果透明度没效果,请在编译指令下边加上alpha 。例如:

#pragma surface surf lightModel alpha

在实际运行中,由运行的平台决定的使用哪个子着色器进行渲染。子着色器是代码的主体,每个子着色器中包含一个或者多个的Pass。在计算着色时,平台优先选择可以使用的子着色器,然后依次运行其中的Pass,得到输出结果。在实际开发时,我们将直接在SubShader这个层次上写代码,系统会把我们的代码编译成若干个合适的Pass。

4.下面是关于Input和SurfaceOutput的结构一些注释

输入输出的结构体样式.png

三:链接

Unity官方的手册文档:材质,着色器和纹理着色器编写参考
参考的网站博客:猫都能学会的Unity3D Shader入门指南Unity Shader 入门(三)颜色和贴图Shader

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

推荐阅读更多精彩内容