unity Shader基础练习(一)

https://www.bilibili.com/video/av41316597?from=search&seid=16258485520600473382
此笔记是视频整理所得 详细的可以看视屏
http://blog.shuiguzi.com/2014/10/28/Release/

环境搭配

这个是VS的编写shader的插件

根据VS版本选择

当然也可以在
image.png

搜索hlsl安装第一个 然后速度挺慢的1M
image.png

我的安装完是在桌面
image.png

运行安装这个应该是根据你VS型号自动匹配的
最好这样安装吧
但是这个有提示但是打{}时候不会自动换行对齐要自己手动空格调位置很麻烦 所以就有了VSCode
链接:https://pan.baidu.com/s/1eteXU72gL7_CY-Uc5D2roQ
提取码:ca2i
这是个package包
image.png

其实只有这个是有用的
进入官方下载VSCode
image.png

然后安装打开
Ctrl+Shift+p

搜索Configure Language


image.png

回车选择zh-cn


image.png
image.png
image.png

安装语言
然后就成了中文版 不行的话可能是顺序反了 先安装语言包再设置
然后再 ctrl+shif+p 并键入 install from vsix
然后按键盘上的Enter键。

image.png

就是Package包里的这个程序安装然后就完毕了 重启就有提示了

Shader和渲染管线是什么

Shader是图形可编程方案的程序片段

渲染管线是一种计算机从数据到最终图形成像的形象描述

材质是商品 Shader是方法 贴图是材料

整体流程
渲染管线内部详细流程

Shader三大高级汇编语言 (之前是用汇编 难度增加)

基于OpenGL的GLSL
基于DirectX(微软)(单机游戏超级多需要安装) HLSL
基于NVIDIA (N卡)的Cg (其实Cg由N卡公司和微软一起开发的,HLSL和Cg其实是一门语言)

为什么使用GPU编程

优点: GPU高并行结构 拥有更多逻辑运算单元(ALU)适合用于密集型数据处理,对数据进行独立运算(多个数据并行运算时间和一个数据单独执行时间是一样的)
CPU大部分面积为控制器和寄存器
GPU并行处理能力强于CPU 让它同一时间处理很多顶点数据
缺点:由于是数据独立运算难以实现数据之间相关性的算法(射线和物体的求交运算)
GPU无法实现CPU强大逻辑运算能力(这就是为何GPU如此牛皮却无法取代CPU的原因)

Unity的Shaderlab结构

shader“name”{
[Properties] //属性
SubShaders //编写Shader 至少要有一个SubShader 但是多个SubShader只能选一个执行 所以多个SubShader是为了不同设备环境所编写(就是游戏里的画质高中低分级渲染)
[FallBack] //回滚 如果以上SubShader都带不动就运行绝大多数都能运行的SubShader(一般往往是Unity自带的)
}

image.png

常用Unity Shader分类

Unlit 只是个纹理不被光照影响(一般用于UI)
VertexLit 顶点光照 放在顶点着色器
Diffuse 漫反射(也是一种光照)放在片段着色器
Normal mapped法线贴图(凹凸贴图) 比漫反射昂贵 (表现更多细节 以假乱真)
Specular高光 模拟光滑物体 高光反射 (金属 玻璃)
Normal Mapped Specular 高光法线贴图 比高光昂贵
Parallax Normal mapped视差法线贴图 (视差: 视觉的差异)
Parallax Normal mapped Specular 视差高光法线贴图

Fixed function shader(功能有限 速度最快 可在几乎所有平台运行)

选择第一个Create Shader Surface Shader
切记不要习惯加; 会导致报错

Shader "Sbin/ff1"// Shader中的位置这个最后一个名字要和你创的Shader名字一样
{
    Properties{
    _Color("Main Color",COLOR)=(1,1,1,1)
    }
    SubShader {
        //编写一个通道pass
        pass{
        //COLOR(1,0,0,1)小括号固定值
           Color[_Color]//中括号参数值
    }
    }
}
image.png

然后就可以创一个Material把Shader改为自己写的 然后就可以滑动调节颜色

Shader "Sbin/ff1"// Shader中的位置这个最后一个名字要和你创的Shader名字一样
{
    Properties{
    _Color("Main Color",COLOR)=(1,1,1,1)
    }
    SubShader {
        //编写一个通道pass
        pass{
        //COLOR(1,0,0,1)小括号固定值
           //Color[_Color]//中括号参数值
           Material//材质
           {
           DIFFUSE[_Color]//漫反射颜色 本身固有颜色
           }
           Lighting on//开灯 off关灯
    }
    }
}

关灯

关灯后是他固有颜色

开灯

正面

背面

背光面是黑的

Shader "Sbin/ff1"// Shader中的位置这个最后一个名字要和你创的Shader名字一样
{
    Properties{
        _Color("Main Color",COLOR) = (1,1,1,1)
        _Ambient("Ambient",COLOR)=(0.3,0.3,0.3,0.3)
    }
        SubShader{
        //编写一个通道pass
        pass {
        //COLOR(1,0,0,1)小括号固定值
        //Color[_Color]//中括号参数值
        Material//材质
        {
            DIFFUSE[_Color]//漫反射颜色 本身固有颜色
            ambient[_Ambient]//环境光影响
        }
            Lighting on//开灯 off关灯
    }
    }
}
然后可以受环境光影响
Shader "Sbin/ff1"// Shader中的位置这个最后一个名字要和你创的Shader名字一样
{
    Properties{
        _Color("Main Color",COLOR) = (1,1,1,1)
        _Ambient("Ambient",COLOR)=(0.3,0.3,0.3,0.3)
        _Specular("Specular",COLOR)= (1,1,1,1)
        _Shininess("Shininess",Range(0,8))=4//范围0-8默认=4 越光滑物体 值越高 
    }
        SubShader{
        //编写一个通道pass
        pass {
        //COLOR(1,0,0,1)小括号固定值
        //Color[_Color]//中括号参数值
        Material//材质
        {
            DIFFUSE[_Color]//漫反射颜色 本身固有颜色
            ambient[_Ambient]//环境光影响
            SPECULAR[_Specular]//高光
            Shininess[_Shininess]//控制反光点集中
        }
            Lighting on//开灯 off关灯
            SeparateSpecular on//独立的镜面高光
    }
    }
}
Shininess

开始跟点一样显示

Shader "Sbin/ff1"// Shader中的位置这个最后一个名字要和你创的Shader名字一样
{
    Properties{
        _Color("Main Color",COLOR) = (1,1,1,1)
        _Ambient("Ambient",COLOR)=(0.3,0.3,0.3,0.3)
        _Specular("Specular",COLOR)= (1,1,1,1)
        _Shininess("Shininess",Range(0,8))=4//范围0-8默认=4 越光滑物体 值越高 
        _Emission("Emission",COLOR)= (1,1,1,1)
    }
        SubShader{
        //编写一个通道pass
        pass {
        //COLOR(1,0,0,1)小括号固定值
        //Color[_Color]//中括号参数值
        Material//材质
        {
            DIFFUSE[_Color]//漫反射颜色 本身固有颜色
            ambient[_Ambient]//环境光影响
            SPECULAR[_Specular]//高光
            Shininess[_Shininess]//控制反光点集中
            Emission[_Emission]//自发光
        }
            Lighting on//开灯 off关灯
            SeparateSpecular on//独立的镜面高光
    }
    }
}
Emission

默认白为最亮

Shader "Sbin/ff2"// Shader中的位置这个最后一个名字要和你创的Shader名字一样
{
    Properties{
        _Color("Main Color",COLOR) = (1,1,1,1)
        _Ambient("Ambient",COLOR)=(0.3,0.3,0.3,0.3)
        _Specular("Specular",COLOR)= (1,1,1,1)
        _Shininess("Shininess",Range(0,8))=4//范围0-8默认=4 越光滑物体 值越高 
        _Emission("Emission",COLOR)= (1,1,1,1)
        _MainTex("MainTex",2d)=""
    }
        SubShader{
        //编写一个通道pass
        pass {
        //COLOR(1,0,0,1)小括号固定值
        //Color[_Color]//中括号参数值
        Material//材质
        {
            DIFFUSE[_Color]//漫反射颜色 本身固有颜色
            ambient[_Ambient]//环境光影响
            SPECULAR[_Specular]//高光
            Shininess[_Shininess]//控制反光点集中
            Emission[_Emission]//自发光
        }
            Lighting on//开灯 off关灯
            SeparateSpecular on//独立的镜面高光
                    
            SetTexture[_MainTex]//纹理
            {
               // Combine合并
               Combine texture * primary double//代表之前属性乘上材质合并 不然之前的属性没用  倍数 看着亮度加或者减
            }
    }
    }
}
在创建一个material
Shader "Sbin/ff2"// Shader中的位置这个最后一个名字要和你创的Shader名字一样
{
    Properties{
        _Color("Main Color",COLOR) = (1,1,1,1)
        _Ambient("Ambient",COLOR)=(0.3,0.3,0.3,0.3)
        _Specular("Specular",COLOR)= (1,1,1,1)
        _Shininess("Shininess",Range(0,8))=4//范围0-8默认=4 越光滑物体 值越高 
        _Emission("Emission",COLOR)= (1,1,1,1)
        _MainTex("MainTex",2d)=""
        _SecondTex("SecondTex",2d)=""
    }
        SubShader{
        //编写一个通道pass
        pass {
        //COLOR(1,0,0,1)小括号固定值
        //Color[_Color]//中括号参数值
        Material//材质
        {
            DIFFUSE[_Color]//漫反射颜色 本身固有颜色
            ambient[_Ambient]//环境光影响
            SPECULAR[_Specular]//高光
            Shininess[_Shininess]//控制反光点集中
            Emission[_Emission]//自发光
        }
            Lighting on//开灯 off关灯
            SeparateSpecular on//独立的镜面高光
                    
            SetTexture[_MainTex]//纹理
            {
               // Combine合并
               Combine texture * primary double//代表之前属性乘上材质合并 不然之前的属性没用  倍数 看着亮度加或者减
            }
            SetTexture[_SecondTex]
            {
               Combine texture * previous double//代表乘上之前所有材质的效果 根据硬件可以添加多个 目前一般两个
            }
    }
    }
}
两张材质合并后
Shader "Sbin/ff2"// Shader中的位置这个最后一个名字要和你创的Shader名字一样
{
    Properties{
        _Color("Main Color",COLOR) = (1,1,1,1)
        _Ambient("Ambient",COLOR)=(0.3,0.3,0.3,0.3)
        _Specular("Specular",COLOR)= (1,1,1,1)
        _Shininess("Shininess",Range(0,8))=4//范围0-8默认=4 越光滑物体 值越高 
        _Emission("Emission",COLOR)= (1,1,1,1)
        _MainTex("MainTex",2d)=""
        _SecondTex("SecondTex",2d)=""
    }
        SubShader{
        //渲染队列
        Tags {"Queue"="Transparent"}
        //编写一个通道pass
        pass {
        Blend SrcAlpha OneMinusSrcAlpha//混合之前的层级Alpha 正常模式(透明度混合) 
        //COLOR(1,0,0,1)小括号固定值
        //Color[_Color]//中括号参数值
        Material//材质
        {
            DIFFUSE[_Color]//漫反射颜色 本身固有颜色
            ambient[_Ambient]//环境光影响
            SPECULAR[_Specular]//高光
            Shininess[_Shininess]//控制反光点集中
            Emission[_Emission]//自发光
        }
            Lighting on//开灯 off关灯
            SeparateSpecular on//独立的镜面高光
                    
            SetTexture[_MainTex]//纹理
            {
               // Combine合并
               Combine texture * primary double//代表乘上之前属性乘上材质合并 不然之前的属性没用  倍数 看着亮度加或者减
            }
            SetTexture[_SecondTex]
            {
               Combine texture * previous double//代表乘上之前所有材质的效果 根据硬件可以添加多个 目前一般两个
            }
    }
    }
}
调节MainColor的Alpha值
Shader "Sbin/ff2"// Shader中的位置这个最后一个名字要和你创的Shader名字一样
{
    Properties{
        _Color("Main Color",COLOR) = (1,1,1,1)
        _Ambient("Ambient",COLOR)=(0.3,0.3,0.3,0.3)
        _Specular("Specular",COLOR)= (1,1,1,1)
        _Shininess("Shininess",Range(0,8))=4//范围0-8默认=4 越光滑物体 值越高 
        _Emission("Emission",COLOR)= (1,1,1,1)
        //不加括号可以 _Constant("ConstantColor",COLOR)=(1,1,1,0.3)放两个贴图上面
        
        _MainTex("MainTex",2d)="white"{}
        _SecondTex("SecondTex",2d)=""{}
        _Constant("ConstantColor",COLOR)=(1,1,1,0.3)
    }
        SubShader{
        //渲染队列
        Tags {"Queue"="Transparent"}//是一个值 译为透明的
        //编写一个通道pass
        pass {
        Blend SrcAlpha OneMinusSrcAlpha//混合之前的层级Alpha 正常模式(透明度混合) 
        //COLOR(1,0,0,1)小括号固定值
        //Color[_Color]//中括号参数值
        Material//材质
        {
            DIFFUSE[_Color]//漫反射颜色 本身固有颜色
            ambient[_Ambient]//环境光影响
            SPECULAR[_Specular]//高光
            Shininess[_Shininess]//控制反光点集中
            Emission[_Emission]//自发光
        }
            Lighting on//开灯 off关灯
            SeparateSpecular on//独立的镜面高光
                    
            SetTexture[_MainTex]//纹理
            {
               // Combine合并
               Combine texture * primary double//代表乘上之前属性乘上材质合并 不然之前的属性没用  倍数 看着亮度加或者减
            }
            SetTexture[_SecondTex]
            {
               ConstantColor[_Constant]//改为用灰度系数控制透明度
               //代表乘上之前所有材质的效果 根据硬件可以添加多个 目前一般两个
               //Combine texture * previous double,texture //针对贴图自身Alpha之前的Alpha无效 一般用于美工给的图自带Alpha通道   
               Combine texture * previous double,texture*constant           
             }
    }
    }
}

效果是一样的 调节透明度方式不一样

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

推荐阅读更多精彩内容

  • 这个《孟姜女的传说》的版本编的不好,可人民文学出版社照样收集出版。 因为这个故事有两段情节的描写,实在有损孟姜女在...
    張楓阅读 606评论 0 0
  • 因为要写论文,所以常来图书馆查阅资料和写作,图书馆里面光线充足、温暖舒适、布局安排合理、学习气氛浓厚,每天来学习的...
    解忧少年阅读 5,592评论 9 6
  • 西游记告诉我们的道理17 经典剧《西游记》,百看不厌。仔细想来,处处皆经典,句句皆可揣摩。(本次依据的第25集) ...
    寒娜Hannah阅读 1,035评论 0 1
  • 中国共有四个故宫:北京故宫、南京故宫、沈阳故宫、台北故宫。 沈阳故宫与北京故宫一起构成了中国仅存的两大完整的明清皇...
    投己有趣阅读 1,438评论 0 3