UnityShader学习随记(1)

前言
  • 资料

1、UNITY SHADER入门精要 冯乐乐著 北京:人民邮电出版社_P370_2016.06

第2章 渲染流水线

draw call

  • 顶点着色器 vertex shader
    • CPU输入
    • 每个顶点调一次顶点着色器
    • 顶点间关系不可知,相互独立,GPU并行处理,速度快
    • 坐标转换、逐顶点光照
      • 把顶点坐标从模型空间转换到齐次裁剪空间,硬件透视除法->设备坐标
      • z分量范围,OpenGL[-1,1],DirectX[0,1]
    • 输出->片元着色器。现代Shader Model,曲面细分着色器或几何着色器
  • 片元着色器 fragment shader 完全可编程
    • 逐片元操作 改颜色、深度缓冲、混合,不可编程,高可配置性
  • 曲面细分着色器 tesselation shader
  • 几何着色器 geometry shader
  • 光栅化概念阶段 三角形设置Triangle Setup和三角形遍历Triangle Traversal,固定函数
    • 不影响屏幕像素颜色值,只产生一系列数据。

  • [顶点着色器] 阶段一
  • [裁剪] 图元部分在视野外,视野边界相交处生成新顶点。不可编程,可配置操作
  • [屏幕映射] 不对z坐标处理,屏幕坐标系+z坐标->窗口坐标系,值传于光栅化阶段
  • [三角形设置] ·计算每个图元覆盖的像素 ·计算像素的颜色
    • 输入-> 屏幕坐标系顶点位置、额外信息(深度值(z坐标)、法线方向、视角方向…)
    • 计算三角形每条边上的像素坐标
  • [三角形遍历] 亦称:扫描变换Scan Conversion。
    • 每个像素被一个三角网格覆盖,生成一个片元fragment。
    • 片元,存储数据。
    • 输出-> 片元序列,一个片元包含状态的集合(屏幕坐标、深度、法线、纹理坐标)
  • [片元着色器FragmentShader] DirectX中称为:像素着色器PixelShader
    • 输入-> 上一阶段,顶点着色器中输出的数据差值,(1)一个或多个颜色值
      (2)顶点纹理坐标,光栅化对纹理坐标进行插值
    • 纹理采样…
  • [逐片元操作Per-FragmentOperations] DirectX中:输出合并阶段Output-Merger
    • 片元->模板测试->深度测试->混合->颜色缓冲区
    • 操作:
      (1)决定片元可见性。深度测试、模板测试…
      (2)通过测试,将片元颜色值与已存于缓冲区的颜色合并
    • 双重缓存DoubleBuffering:
      (1)场景渲染在幕后发生,在后置缓冲BackBuffer中。
      (2)渲染完成与前置缓冲FrontBuffer,存放原显示在屏幕的图像,内容交换
    • 混合Blend:
      (1)关闭,则片元着色器计算出的颜色值会直接覆盖颜色缓冲区中的,做不出半透明效果

  • 屏幕坐标差异,图像倒转的可能原因

    • OpenGL 屏幕左下角当作最小窗口坐标
      DirectX 左上角
  • 显卡驱动,相当于显卡的操作系统。

  • 着色语言ShadingLanguage

    • DirectX HLSL(HighLevelShadingLanguage)
      OpenGL GLSL(OpenGLShadingLanguage)
      NVIDIA CG(CforGraphic)
    • 编译成与机器无关的汇编语言,中间语言(IntermediateLanguage, IL)
第3章 UnityShader
  • 本质:一个文本文件
  • 材质Material + UnityShader
    • 结合GameObject的Mesh或ParticleSystems组件来工作
  • UnityShader模板:
    • Standard Surface shader:标准光照模型表面着色器
    • Unlit Shader:不含光照,含雾效,顶点/片元着色器
    • Image Effect shader:实现屏幕后处理效果的基础模板
    • Compute Shader:特殊shader文件,利用GPU的并行性进行与常规渲染流水线无关的计算

  • Properties语义块

    • 访问属性,需在CG代码片定义与属性类型相匹配的变量。不在Properties声明属性,也可在CG直接定义变量。
    • 作用:让声明的属性可以出现在材质面板中
    • Properties语义块支持的属性类型
    属性类型默认值的定义语法例子
    Intnumber_Int(“Int”, Int) = 2
    Floatnumber_Float(“Float”, Float) = 1.5
    Range(min,max)number_Range(“Range”, Range(0.0, 5.0)) = 3.0
    Color(number,number,number,number)_Color(“Color”, Color) = (1,1,1,1)
    Vector(number,number,number,number)_Vector(“Vector”, Vector) = (1,1,1,1)
    2D“defaulttexture”{}_2D(“2D”, 2D) = “”{}
    Cube“defaulttexture”{}_Cube(“Cube”, Cube) = “wihte”{}
    3D“defaulttexture”{}_3D(“3D”, 3D) = “wihte”{}
    Shader "Custom/ShaderLabProperties" {
        Properties {
            // Numbers and Sliders
            _Int ("Int", Int) = 2
            _Range ("Range", Range(0.0, 5.0)) = 2.0
            // Colors and Vectors
            _Color ("Color", Color) = (1,1,1,1)
            _Vector ("Vector", Vector) = (1,1,1,1)
            //Textures
            _2D ("2D", 2D) = ""{}
            _Cube ("Cube", Cube) = "white"{}
        }
    }
    
  • SubShader语义块

    • 可有多个,至少需一个。不同的显卡具有不同的能力。

    • 扫描所以SubShader,选择第一个能够在目标平台上运行的。都不支持,则使用Fallback语义指定的UnityShader。

    • 字段

      • Pass 定义一次完整的渲染流程。数目过多,渲染性能下降。
      • RenderSetup [可选] 状态,可Pass中声明,SubShader中声明则用于所有Pass,因语法相同。
      • Tags [可选] 标签,可Pass中声明,SubShader中某些是特定的,不一样。
    • 常见的渲染状态设置选项

    状态名称设置命令解释
    CullCullBack/Front/Off设置剔除模式:剔除背面/正面/关闭
    ZTestZtest Lest Greater/LEqual/GEqual/NotEqual/Always设置深度测试时使用的函数
    ZWriteZWriter On/Off开启/关闭深度写入
    BlendBlend SrcFactor DstFator开启并设置混合模式
    • SubShader的标签

      Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
      
      • 键值对(Key/Value Pair),字符串类型
      • SubShader与渲染引擎之间的沟通桥梁
      • SubShader的标签类型
      标签类型说明例子
      Queue控制渲染顺序,指定该物体属于哪个渲染队列。可用于保证所有透明物体在所有不透明物体后面被渲染。Tags{“Queue” = “Transparent”}
      RenderType对着色器分类,例如这是不透明,或透明的着色器等。可用于着色器替换(Shader Replacement)功能Tags{“RenderType” = “Opaque”}
      DisableBatching是否使用批处理。一些SubShader使用Unity的批处理时出现问题,例如使用了模型空间下的坐标进行顶点动画。Tags{“DisableBatching” = “True”}
      ForceNoShadowCasting控制使用该SubShader的物体是否投射阴影Tags{“ForceNoShadowCasting” = “True”}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值