shader学习

资料

第一课 图形硬件简史与可编程管线

课时总结

  • 2003年开始正式进入可编程GPU阶段
  • GPU的并行处理能力强于CPU
  • 目前GPU无法代替CPU

第二课 shader和渲染管线

20190312014350.png

  • GPU前段模块->图源装配:
    过去只有集成在硬件当中的顶点着色器,现在可编程
  • 光栅化:
    把计算机显卡当中运算的数据进行一个细分用于适配屏幕上具体的每一个像素的显示
  • 像素运算:
    光栅化不等同于像素运算.像素运算最终反映的是颜色,光栅化过后得到的结果是帧缓存.这个过程中可以加入片段着色器.
    20190312104505.png
  • Vertex Processor
    顶点处理程序,运算的结果将会交给像素处理器
  • Frame Buffer
    帧缓冲中容纳了是计算机依次显示所要使用的数据,但不只是屏幕上用语显示的颜色的信息,可能还有其他的附加信息.比如深度值
    20190312105352.png
  • Transform, TexGen, Lighting
    • Transform
      模型的空间变换(针对顶点的空间几何变换)
    • Texture Generator
      纹理坐标的生成,主要用于在顶点当中取得纹理坐标,纹理坐标转化为uv取值的范围
    • Lighting
      光照
  • Vertex Shader
    改变上个模块的光照,变换,纹理生成等
  • Culling Depth Test
    • Culling
      裁剪.物体在镜头面前展示,背对摄像头的面看不到,可能就会被裁剪,不处理看不到的面的顶点数据.
    • Depth Test
      深度测试.范围超过摄像头最近或最远的渲染范围之后,也会被剔除
  • Texturing Fog
    纹理采样.进入光栅化阶段.从纹理当中找到纹理中对应的一个点
  • Fragmen Shader
    远处的物体可能需要雾化处理.处于片段shader的可编程范围
  • Alpha Test
    绘制半透明或全透明物体
  • Blending
    混合最终的图像

可编程能力是两个部分,一部分是变换和光照,使用顶点shader编写顶点着色器
如何采样,计算颜色以及雾化处理等等,这部分放到片段着色器

unity当中,优化主要部分是减少游戏调用gpu渲染的调度次数.CPU搜集数据,产生GPU调度数据.这个过程是昂贵的.

shader和材质,贴图的关系

shader实际上是一小段程序.负责将输入的顶点数据以指定的方式和输入的贴图或者颜色组合起来然后输出.
绘图单元可以依据这个输出将图像绘制到屏幕上.
输入的贴图或者颜色等,加上对应的shader,以及对shader]d特定的参数设置,将这些内容(shader及输入参数)打包存储在一起.得到的就是一个Material(材质).之后我们便可以将材质赋予三维物体来渲染(输出)了.

材质好比引擎最终的商品,shader是生产这种商品的加工方法,而贴图是原材料.

课时总结

  • Shader是图形可编程方案的程序片段
  • 渲染管线是一种计算机从数据到最终图形成像的形象描述
  • 材质是商品,shader是方法,贴图是材料

第三课 shader的三大主流高级编程语言

  • HLSL
    基于DirectX的High Level Shading Language
  • GLSL
    基于OpenGL的OpenGL Shading Language
  • CG
    NVIDIA公司的C for Graphic

第四课 Unity Shader的组织形式

  • surface shader
    unity推荐和鼓励的shader.图形管线能够用于识别的,就是vertex and fragment shader.surface shader是对vertex and fragment shader的一种包装.unity最终会把surface shader编译成能被硬件识别和调用的vertex and fragment shader
  • vertex and fragment shader
  • fixed function shaders
    固定管线的shader.

Shaderlab 语法基本结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Shader "MyShader" {
Properties {
_MyTexture ("My Texture", 2D) = "white" { }
// place other properties here, such as colors or vectors.
}
SubShader {
// place the shader code here for your:
// - surface shader,
// - vertex and program shader, or
// - fixed function shader
}
SubShader {
// a simpler version of the subshader above goes here.
// this version is for supporting older graphics cards.
}
}

unity自带shader

  • Unlit
    不发光
  • VertexLit
    顶点光照
  • Diffuse
    漫反射.不仅仅在顶点上进行光照计算,在片段上进行光照计算
  • Normal Mapped
    法线贴图.用的比较多.通过一张贴图进行采样.贴图是关于法向量存储的贴图.把这张图采样出的数据作为法向量再进行光照计算.主要目的是当几何模型面片数量,顶点数量不太多,为表达丰富的细节.
  • Specular
    高光.玻璃等
  • Normal Mapped Specular
    高光法线贴图.较昂贵
  • Parallax Normal mapped
    视差法线贴图
  • Parallax Normal mapped Specular
    高光视差法线贴图

Fixed function shader

固定功能的shader.功能有限但是性能很好

Surface Shader

Surface Shader无需编写pass通道