(三) 计算机图形学 之 Shader 定义 (顶点 着色器)

shader : 决定材质 跟灯光的作用。

shader 属性定义的通用格式:

Properties { Property [ Property ... ] } (相当于一个类的公共变量)

Properties
{
    定义一个Int:
    name("display name" , Int) = 1

    定义一个Float:
    name("display name" , Float) = 1.0

    定义一个Range (一个变化范围)
    name("display name" , Range( 1 , 5 ) ) = 2

    定义一个颜色 (4维表示)
    name("display name" , Color) = (1,1,1,1)

    定义一个 4维数组
    name ("display name" ,  Vector ) = (1,1,1,1)

    定义一个纹理 (Texture)
    name ("display name" , 2D ) = "white"{}

    定义一个 CubeMap (6个面的纹理 反射 或 天空盒)
    name ("display name" , Cube ) = "skybox"{TexGen CubeReflect}  //定义一个立方贴图纹理属性

    定义一个3d的纹理
    name ("display name" , 3D ) = ""{}
}


1:name('display name",type)=值;

name:  变量名字, 以下划线开头_Name;
disply name: 共外界 Unity 菜单栏显示
type(int/Float/Range): 变量类型
= 1/1.0/2: 默认值

2:类型:

Float、Int、Color(num,num,num,num)(0~1)、Vector(4维向量)、Range(start,end)
2D:2D纹理属性;
Rect:矩形纹理属性;
Cube:立方体纹理属性;
3D:3D纹理属性;
name("dispalyname",2D) = "name"{options}

3:options:纹理属性选项

TexGen:纹理生成模式,纹理自动生成纹理坐标的模式;顶点shader将会忽略此选项;(模式下包括ObjectLiner、EyeLinear、SphereMap、Cube Reflect CubeNormal)
LightmapMod:光照贴图模式如果设置这个选项,纹理会被渲染器的光线贴图所影响。


3D纹理(限制): 
1.只能用脚本创建
2.opengl3.0 及以上 才支持

Shader能操作的只有以下三部分
一、顶点 着色器:
1. 计算顶点的颜色
2.顶点变换
3.灯光的作用

二 、片段 着色器:
1.纹理采样。(贴纹理)


三。、三大测试:


第一点:SubShader-顶点着色器详细讲解:

1:SubShader{[Tags],[CommonState],Pass{}}
子着色器由标签(Tags),通用状态,通过列表组成,它定义了一个渲染通道列表,并可选为所有通道初始化需要的通用状态;
2:SubShader渲染的时候,将优先渲染一个被每个通道所定义的对象。
3:通道的类型:RegularPass、UsePass、GrabPass。
4:在通道中定义状态同时对整个子着色器可见,那么所有的通道可以共享状态。

SubShader{
    Tags{"Queue","Transparent"}
    Pass{
        Lighting Off // 关闭光照
        ...
    }
}

Tags:

 Tags{"标签1","value1""标签2"="value2"}
标签的类型:
Queue tag:队列标签;
RenderType tag:渲染类型标签;
DisableBatching tag:禁用批处理标签;
ForceNoShadowCasting tag:强制不投影标签;
IgnoreProjecttor tag:忽略投影标签;
CanUseSpriteAtlas tag:使用精灵图集标签;
PreviewType tag:预览类型标签;

Pass:

1.subshader包装了一个渲染方案,这些方案由一个个通道(Pass)来执行的,SubShader可以包括很多通道块,每个Pass都能使几何体渲染一次;
2.Pass基本语法
Pass{[Name and Tags][RenderSetup][Texture Setup]}
Pass块的Name引用此Pass,可以在其他着色器的Pass块中引用它,减少重复操作,Name命令必须大写;

RegularPass 通道类型的渲染设置:

1.Lighting光照:开启关闭定点光照 On/Off
2.Material{材质块}:材质,定义一个使用定点光照管线的材质
3.ColorMaterial:颜色集 计算定点光照时,使用顶点颜色
4.SeparateSpecular:开关状态,开启或关闭帝国点光照相关的镜面高光颜色,On/Off
5.Color 设置顶点光照关闭时,所使用的颜色
6.Fog(雾块):设置雾参数
7.AlphaTest:Alpht测试
8.ZTest:深度测试模式
9.ZWrite:深度写模式
10.Blend:混合模式(SourceBlendMode、DestBlendMode、AlphaSourcesBlendMode、AlphaDstBlendMode)
11.ColorMask 颜色遮罩:设置颜色遮罩,颜色值可以有RGB或A或0或R、G、B、A的组合,设置为0关闭所有颜色通道渲染;
12.Offset 偏移因子:设置深度偏移

UsePass 通道类型的渲染设置(特殊通道):

插入所有来自其他着色器的给定名字的通道;
UsePass“Shader/Name", //Name为着色器通道名称;
UsePass”Specular/BASE" //插入Specular中为BASE的通道;

GrabPass 通道类型的渲染设置(特殊通道):

GrabPass{}:一种特殊通道类型,他会捕获物体所在位置的屏幕内容,并写入一个纹理中,这个纹理能被用于后续通道中完成一些高级图像特效,后续通道可以使用_GrabTexture进行访问。
GrabPass{"纹理名称"}捕获屏幕内容到指定纹理中,后续通道可以通过纹理名称来访问。

Fallback:

1.降级,定义的所有子着色器,都不能运行的话,则会尝试降级;

2.Fallback“着色器名称”

3.Fallback Off,没有降级,并且不会打印任何警告。

Category 分类:

分类是渲染命令的逻辑组。例如着色器可以有多个子着色器,他们都要关闭雾效果可以如下:

Shader “xxx”{

    Category{
        Fog{Mode Off}
        SubShader{...}
        SubShader{...}
    }

}

 

Shader "TestShader/Vertex"
{
    Properties
    {    
        _MainTex("Texture",2D) = "white"()
        _TestColor("Texture",Color) = (0.1.0.1)
    }
    SubShader
    {
        Pass
        {
            //Color(0,1,0,1)
            Color[_TestColor]
            Material
            {
                //Diffuse(1,1,1,1) // 灯光的漫反射与材质如何作用
                Diffuse[_TestColor]
                //环境光设置
                Ambient[_TestColor]
                //高光设置 需要打开高光开关
                Specular[_TestColor]
                //自发光设置
                Emission[_TestColor]
            }
            //高光开关(只对高光起作用)
            SeparateSpecular On
            //灯光总开关(对所有光起作用)
            Lighting On
        }
    }
}


调节 顶点的颜色:
_TestColor("Texture",Color) = (0.1.0.1)
 1. Color(0.1.0.1)
 2. Color[ _TestColor]

shader1.0 灯光计算公式:
Ambient * Lighting Window`s Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission

Ambient: 环境光
Diffuse: 满反射光
Specular: 镜面反射
Emission : 自发光
Light Color: 灯光颜色

第二点:片段着色器详细讲解:


贴纹理原理:
 提问:大小 跟 显示区域不匹配怎么办?(有以下三种情况)
1.纹理 跟显示区域相等  (纹理就是贴图图片,显示区域是要放置材质球的物体 例如Culb)
显示区域 100*100     纹理大小 100*100

2.纹理 大于显示区域
显示区域 100*100    纹理大小 1024*512


处理有两种方法:
方法一、采用 等比例 映射

 

 

UV(坐标系):

方法二、Unity提供的 (贴图菜单里的 Filter Mode选项)
。Point : 就近采样
。Bliinear: 就近 周围 4个像素的平均     (上+中+下+左+右)/5
。Tlilnear: 就近 周围 8个像素的平均      (左上+上+右上+右+右下+下+左下+左+中)/9

3.纹理 小于显示区域
显示区域 100*100   纹理大小 

锯齿: 马赛克:
处理也可用 Unity提供的 Filter Mode选项里的解决该问题。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GarFe-Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值