Unity Shader入门精要 阅读笔记一

第一张渲染流水线

Real-Time Rendering 这本里对渲染流水线的划分主要分为三个阶段:应用阶段、几何阶段、光栅化阶段

  • 应用阶段是在CPU中运行,用于处理用户定义的3维空间的信息
  • 几何阶段在GPU中运行,用于用户定义的3维空间,并将其映射到屏幕空间中
  • 光栅化,将上一步的屏幕信息,转换成屏幕像素信息。

CPU流水线:{

应用阶段主要分为三个阶段:
- 将数据加载到显存中
- 设置渲染状态
- 调用Draw call(挺重要的一个东西)

硬件流程是:HDD->RAM->VRAM(显存,显卡的存储空间)

渲染状态:定义累网格应该被怎样渲染。这个步骤由CPU指挥。

  • Draw Call:在硬件流程完成后,CPU向GPU发送的渲染指令。(减少Draw Call是游戏性能提升的关键)
    }

GPU流水线:{

graph LR
几何阶段
A[顶点数据]-->B(顶点着色器)
B--> C(曲面细分)
C--> D(几何着色器)
D--> E[剪裁]
E--> F[屏幕映射]
光栅化
G-->H[三角遍历]
H[三角遍历]-->J(片元着色器)
J-->K[逐片元操作]
K-->l[屏幕图像]

三大可编程的流程:顶点着色器、片元着色器、几何着色器

顶点着色器{

顶点着色器的主要工作:坐标变换和逐顶点光照

在坐标变化过程中,顶点着色器必须完成将顶点的世界坐标转换成齐次剪裁坐标空间中。

}

剪裁{

  • 物体于摄像机的关系:在摄像机范围内,在摄像机范围外,部分在摄像机范围内。
  • 将物体转换到齐次剪裁坐标系后,如果物体在外面,那么就不需要做渲染,如果部分在内部,就在剪裁这步进行剪裁,将齐次立方体内部的顶点进行保留。
  • 剪裁步骤不能编程控制,但是能够配置。

}

屏幕映射{
- 将每个图元的信息转换到屏幕坐标中。
- openGL和DirectX坐标系之间存在差异。O的坐标原点在左下角,而D的坐标原点在左上角。

}


三角遍历{

  • 检查每一个像素是不是被三角面片所覆盖,如果覆盖那么就生成一个片元。(之前做过类似的,但是比这个low很多)
  • 被三角形包围的像素通过插值来获取对应的深度。
  • 得到的片元中不知包括像素,也包括法线等其他渲染信息。
    }

片元着色器{

  • 输入是上一个阶段对顶点信息插值得到的结果。输出是一个或多个颜色值。
  • 这一阶段最重要的技术是纹理采样。通过三个顶点的纹理坐标的插值,获得覆盖片元的纹理坐标。

}

逐片元操作{

  • 这里决定一个片元是否显示。
  • 其中的测试包括:模板测试、深度测试、混合。这些都是在unity shader中能够找到对应的变量。所有通过这些测试的片元才会真正的显示在屏幕上。
  • 这个过程是高度可配置的。
  • 这里是渲染队列的基础。
  • 之前在unity shader中遇到的混合选项、深度选项、模板选项基本都是在这里。
    }

逐片元操作是挺有意思的一块,这里要重点记录。
一、模板测试。开发者可以制定模板测试的比较函数(小于或大于等于)。不管片元是否通过测试,都可以修改模板缓冲区。这个应该是和unity shader中的blend***这个函数相关。

二、深度测试。深度测试也是配置。如果一个片元完成了深度测试,那么这个片元就能够写入深度缓存区。在正常渲染阶段,如果要实现透明效果,那么必须打开深度缓存和深度写入。

三、合并。通过所有测试的片元之后需要进行合并。合并可以通过配置来开启或者关闭。如果关闭了,那么后面的片元就直接覆盖了缓冲区的像素,如果开启了,那么就进行混合。

DrawCall{
在unity游戏开发的性能优化中,通常我们都知道需要减少DC。那么DC到底是什么?
- DC是CPU向GPU发送的渲染指令。每条指令往往伴随着一些配置操作。所以,DC过多,那么细节的配置操作也会相应增多,因此DC越多,性能越差。
如果优化DC
- 批处理技术。我们每次一个DC需要进行配置,那么我们其实就可以将相同材质的网格进行合并。这样就可以实现很多网格进行一次DC。这就是批处理,减少CPU端对DC的配置操作。
- 影响DC的性能是在CPU端而不是在GPU端。

}

固定渲染流水线{

-之前写的shader其实都是固定渲染流水线中的。所以不支持新的GPU,因此在小米4中效果不好。现在越来越多的GPU不支持固定渲染流水线,unity中的fixed shader也支持的更少了,所以这一大块不着急学。

}

}

总结:渲染流水线是渲染的基础,是现代GPU的渲染的流程。
shader是一种渲染方面的“高级”语言,对应了渲染流程中可编程(顶点着色器等)、或者可配置的部分。是通过编程开控制渲染流水线的一些步骤。unity shader其实是对现在的shader的一种封装,和主流的shader还是有区别的。但是基本可以使用主流的shader的一些方法。
主流的shader语言有:HLSL(high level shading language)、GLSL(opengl shadign language)、cg(c for graphic)

猜你喜欢

转载自blog.csdn.net/u011618339/article/details/78451041