https://www.bilibili.com/video/av41316597?from=search&seid=16258485520600473382
此笔记是视频整理所得 详细的可以看视屏
http://blog.shuiguzi.com/2014/10/28/Release/
环境搭配
这个是VS的编写shader的插件
当然也可以在
搜索hlsl安装第一个 然后速度挺慢的1M
我的安装完是在桌面
运行安装这个应该是根据你VS型号自动匹配的
最好这样安装吧
但是这个有提示但是打{}时候不会自动换行对齐要自己手动空格调位置很麻烦 所以就有了VSCode
链接:https://pan.baidu.com/s/1eteXU72gL7_CY-Uc5D2roQ
提取码:ca2i
这是个package包
其实只有这个是有用的
进入官方下载VSCode
然后安装打开
Ctrl+Shift+p
搜索Configure Language
回车选择zh-cn
安装语言
然后就成了中文版 不行的话可能是顺序反了 先安装语言包再设置
然后再 ctrl+shif+p 并键入 install from vsix
然后按键盘上的Enter键。
就是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自带的)
}
常用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]//中括号参数值
}
}
}
然后就可以创一个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//独立的镜面高光
}
}
}
开始跟点一样显示
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//独立的镜面高光
}
}
}
默认白为最亮
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//代表之前属性乘上材质合并 不然之前的属性没用 倍数 看着亮度加或者减
}
}
}
}
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//代表乘上之前所有材质的效果 根据硬件可以添加多个 目前一般两个
}
}
}
}
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
}
}
}
}
效果是一样的 调节透明度方式不一样