ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

shader入门精要

2019-03-13 09:51:37  阅读:611  来源: 互联网

标签:入门 渲染 矩阵 shader 像素 片元 顶点 精要 着色器


shader链接: https://blog.csdn.net/tjw02241035621611/article/details/80038608

shader优化CPU:    https://blog.csdn.net/tjw02241035621611/article/details/80090204sahd

 

2.2.CPU和GPU之间的通信

   分为三步:

   [1] 把数据加载到显存中    [2]设置渲染状态    【3】调用drawcall

2.2.1把数据加载到显存中

渲染的数据需要从硬盘中加载到系统内存[RAM]中<通过cpu>。网格纹理等数据又被加载到显存【VRAM】中,.当数据从内存加载到显存后,RAM中的数据就可以移除了,但是有时候需要使用它【比如纹理需要读写,模型网格需要动态,模型需要读写等】,且加载到内存的过程非常耗时,所以不想被移除。

2.2.3  调用DrawCall     

    DrawCall是一个命令,只是指向一个需要被渲染的图元列表,而不包含材质信息,当给一个命令时,GPU根据给的渲染状态【材质,纹理,着色器】和顶点数据来计算。计算渲染的过程就是GPU流水线。

2.3 GPU流水线

2.3.1:概述

   图元:基本的几何单位,如模型的点,线,面。       片元:像素点,它比像素多一些位置、法向量

    首先接受顶点数据作为输入,这些顶点数据由应用阶段加载到显存中,再通过drawcall指定

    1.几何阶段:传给顶点着色器【完全可编程】,实现顶点的空间变换颜色等。【曲面着色器】是一个可选的着色器,用于细分图元,【几何着色器】是一个可选的着色器,用于逐行逐图元着色操作或者产生更多的图元。【裁剪】,控制不在摄像机视野的顶点裁掉,剔除三角图元的面片。【屏幕映射】不可配置,不可编程,把图元坐标转换到屏幕坐标系中。

   2.光栅化阶段:【三角形设置和遍历】执行的都是固定的函数、【片元着色器】完全可编程,用于实现逐片操作、【逐片元操作】,修改颜色,深度,混合,它不可编程,但是有很高的配置性【比如说混合的模式】。

2.3.2 顶点着色器

    概念:流水线的第一个阶段,输入源是cpu,处理进来的每个顶点,无法获取顶点之间的关系,顶点相互独立,所以gpu可以对其并行处理。

   基本作用;把顶点坐标从模型空间转换到齐次裁剪空间   o.pos = mul(UNITY_MVP,v.position);

   齐次坐标系就是笛卡尔坐标系中的一个坐标(1,2)乘以一个实数(2)得到 (2,4,2)

2.3.3 裁剪

    图元在视野内保留,在视野外删除,部分在视野则生成新的顶点,多出部分删除,这部分不可编程,由硬件决定裁剪范围,但是可以自定义一个裁剪操对这一步进行配置【lod】。

2.3.4屏幕映射

      屏幕映射得到的屏幕坐标决定了这个顶点对应屏幕上哪个像素以及距离这个像素有多远。

【视口变换屏幕的wide和height和设置投影矩阵的wide和height比例都是一样的,所以不同分辨率看到的图像缩放是一样的】

  注意:OpenGL把屏幕的左下角当成最小的窗口坐标值,微软的窗口都是这样的,DirectX是屏幕的左上角是最小的窗口坐标值。注意图像倒转可能是这个原因造成的。

2.3.5 三角形设置

    光栅化的目标:计算每个图元覆盖了哪些像素,以及为这些计算像素的颜色

    光栅化的第一个流水线阶段是三角形设置,计算光栅化一个三角网格所需要的信息

2.3.6 三角形遍历

   深度 :

https://baike.baidu.com/item/深度缓冲/16859168?fr=aladdin

当三维图形卡渲染物体的时候,每一个所生成的像素的深度(即z坐标)就保存在一个缓冲区中。这个缓冲区叫作z缓冲区或者深度缓冲区,这个缓冲区通常组织成一个保存每个屏幕像素深度的x-y二维数组。如果场景中的另外一个物体也在同一个像素生成渲染结果,那么图形处理卡就会比较二者的深度,并且保留距离观察者较近的物体。然后这个所保留的物体点深度保存到深度缓冲区中。最后,图形卡就可以根据深度缓冲区正确地生成通常的深度感知效果:较近的物体遮挡较远的物体。这个过程叫作z消隐

     该阶段检查每个像素是否被一个三角网格所覆盖,如果被覆盖就生成一个片元。这个阶段也叫扫描变换。

对三个顶点所覆盖的区域的像素做插值。

2.3.7 片元着色器

      片元着色器,在Direct中,【片元着色器】被称为【像素着色器】,片元不是真正意义上的像素,包含了其他信息。

片元着色器: 上一个阶段对顶点信息插值得到的结果是此着色器的输入,而输出是一个或者多个颜色值。例如:纹理采样,通常在顶点着色器阶段输出每个顶点对应的纹理坐标,再经过光栅化阶段对三角网格的三个顶点对应的纹理坐标进行插值后,就得到覆盖了片元的纹理坐标。

  局限性是片元仅仅可以影响单个片元,也就是说当执行片元着色器时,它不可以将自己的任何结果直接发送给它的邻居们。但有一个情况例外,片元着色器可以访问到导出信息【gradient或者derivative】

运行的顺序: 顶点着色器 —> 片元着色器 —> 模板测试 —> 深度测试。

3.3Unity Shader的结构

展示所有属性eg:

 

结构eg:

状态eg: 

 Blend SrcFactor DstFactor:  稍微解释一下,这行指令意思就是将本 Shader 计算出的颜色值(源颜色值,即蓝色) * 源Alpha值(0.6) + 目标颜色值(可以理解为背景色) * (1-0.6),从而让蓝色方块展示出了40%的透明度。

SubShader 的标签:

Tags是键值对,键值都是字符串类型,这些键值对是SubShader和渲染引擎之间的沟通桥梁,需要怎样何时渲染这个对象。

标签的结构:

pass中可定义的标签类型:

除了普通的Pass定义外,UnityShader还支持特殊的Pass,以便代码复用,实现复杂效果:

3.3.4 FallBack

   

   UnityShader的形式

    3.4.1 Unity的宠儿:表面着色器

  概述:unity自己创造的一种shader代码类型:代码量少,unity在背后做了许多工作,但渲染代价比较大。可以理解是对顶点和片元着色器更高层的封装。存在的意义是,处理了很多光照细节。

    

3.4.2 最聪明的孩子: 顶点/片元着色器

和表面着色器不同的是顶点语句块是写在pass内,而非SubShader内,因为表面是不需要关心多少个pass,以及如何渲染的问题。

3.4.3 被抛弃的角落:固定管线着色器

3.4.4 选择哪种UnityShader形式:

第四章 学习Shader所需的数学基础:

二维笛卡尔坐标系:不论轴向,都是可以通过变换成标准的坐标系。都是等价的

三维:左手和右手坐标系

unity中,模型空间使用的是左手坐标系,观察空间使用的是左手坐标系。

4.3 点和矢量

   矢量的运算:

  (1) 和标量的乘除

相乘时,每项都相乘这个标量,相除时,这个标量只能做分母且不为0.

几何意义:就是把向量缩放标量倍。标量是负数的话,则方向取反。

  (2)矢量的加减【互未矢量才能加减】

       对应分量分别加减。三角形定则:把一个点先偏移a的位置再偏移b的位置。把起点和结束点相连,或者平移。

矢量模长:

4.单位矢量:

模运算:

注意:零矢量不能归一化,分母不能为0.

点乘公式【也叫内积】:

公式一:   对应分量相乘,再相加。

应用:

6.矢量的叉乘【外积】

公式一:

公式二:

应用:计算垂直于一个平面,三角形的矢量。叉积中大拇指代表法线方向。四指是旋转方向。

练习题:【点积和叉积的应用】

答案:

4.4矩阵

  4.4.3 矩阵运算:

   1.矩阵和标量的乘法: 和矩阵中的每个标量相乘

   2.矩阵和矩阵乘法: 

  eg: 矩阵A r * n   和  B n*c 相乘 得到r*c大小的矩阵。  

   注意: 第一个矩阵的列数必须和第二个矩阵的行数相同。得到的矩阵行数是第一个矩阵的行数,列数是第二个矩阵的列数。

  

 

标签:入门,渲染,矩阵,shader,像素,片元,顶点,精要,着色器
来源: https://blog.csdn.net/qq_35433081/article/details/88358353

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有