1 几何阶段(顶点shader处理这部分)

模型坐标空间-世界坐标空间-观察坐标空间-屏幕坐标空间

其中从观察空间 到 屏幕空间需要经过3步(CVV单位立方体,规范立方体)

a用透视变换矩阵把顶点从视锥体中变换到裁剪空间(齐次空间,用齐次坐标表示);

b在 裁剪空间进行图元裁剪;(这里就是视域剔除View Frustum Culling),然后齐次空间除w把点转换到CVV中

c屏幕映射:将经过前述过程得到的坐标映射到屏幕坐标系上

顶点着色程序从GPU 前端模块(寄存器)中提取图元信息(顶点位置、法

向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等

操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需

要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传

递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送

光栅操作模块。

------------------------------------------------------------------------------------------------------------------------

2图元装配

就是处理顶点连接关系(这里会进行背面剔除Back-Face Culling,以减少顶点)

------------------------------------------------------------------------------------------------------------------------

3光栅化阶段


决定哪些像素被集合图形覆盖的过程

光栅化前,图形都是连续的,需要通过光栅化把这些连续的图形转换为屏幕上对应的像素点

光栅化后会进行片段操作(片段shader处理这部分)

a 遮挡剔除,消除遮挡面

b 纹理操作Texture operation

c 混合 blending,透明处理

d 滤镜或滤波 filtering ,一种颜色经过某种滤波或滤镜处理后再输出

这里特殊说明下,unity shader 的surf 和自定义光照部分都是在这里处理的,surf可以处理纹理,而光照在几何阶段猜测只是记录光照数据,这里计算光照对颜色的影响

光栅化过程用到的4个缓冲

1 深度缓冲区 z buffer                保存顶点深度

2 模板缓冲区 stencil buffer      保存顶点是否处于阴影体内的标识,有的说模板缓冲室深度缓冲的一部分

3 帧缓冲区 frame buffer           存储深度缓冲和颜色缓冲的混合

4 颜色缓冲区 color buffer

另外最后会进行个视口裁减

片断着色程序对每个片断进行独立的颜色计算,最后输出颜色值的就是该片

段最终显示的颜色。可以这样说,顶点着色程序主要进行几何方面的运算,而片

段着色程序主要针对最终的颜色值进行计算。

片段着色程序还有一个突出的特点是:拥有检索纹理的能力。对于GPU 而言,

纹理等价于数组,这意味着,如果要做通用计算,例如数组排序、字符串检索等,

就必须使用到片段着色程序

片断和像素有什么不一样?所谓片断就是所有的三维顶点

在光栅化之后的数据集合,这些数据还没有经过深度值比较,而屏幕显示的像素

都是经过深度比较的。

------------------------------------------------------------------------------------------------------------------------

每个顶点数据都会执行一次顶点程序;每个片段都会执行一次片段程序。

unity shaderlab中AlphaTest的位置是在fragment函数之后可以阻止最终渲染到帧缓存,

StencilTest是在fragment之前可以阻止fragment函数执行

下图Culling DepthTest是深度测试(不包括SencilTest的说明)

GPU渲染管线与shader的更多相关文章

  1. GPU渲染管线概述

    1.顶点着色器 顶点着色器是流水线的第一个阶段,它的输入来自于CPU.顶点着色器的处理单位是顶点,也就是说输入进来的每个顶点都会调用一次顶点着色器. 顶点着色器需要完成的工作主要有:坐标变换和逐顶点光 ...

  2. 【Aladdin Unity3D Shader编程】之一 基本入门

    OpenGL.DirectX以及GLSL.HLSL.CG OpenGL和DirectX是图像应用编程接口,用于渲染二维或者三维图形. GLSL着色语言是用来在OpenGL中着色编程的语言,有点在于跨平 ...

  3. GPU寄存器相关

    1,shader model 3.0 只有256个常量寄存器,32个临时寄存器.对应dx9, opengl2.0, opengles2.0 2,shader model 4.0 有65536个寄存器, ...

  4. CPU GPU设计工作原理《转》

    我知道这非常长,可是,我坚持看完了.希望有幸看到这文章并对图形方面有兴趣的朋友,也能坚持看完.一定大有收获.毕竟知道它们究竟是怎么"私下勾搭"的.会有利于我们用程序来指挥它们... ...

  5. 着色语言(Shader Language)

    摘抄"GPU Programming And Cg Language Primer 1rd Edition" 中文名"GPU编程与CG语言之阳春白雪下里巴人" ...

  6. 深入GPU硬件架构及运行机制

    目录 一.导言 1.1 为何要了解GPU? 1.2 内容要点 1.3 带着问题阅读 二.GPU概述 2.1 GPU是什么? 2.2 GPU历史 2.2.1 NV GPU发展史 2.2.2 NV GPU ...

  7. [转]3D渲染管线

    转自:http://tgerm.org/SRP/ 在3D中有两种渲染管线,分别是图形渲染管线和GPU渲染管线. 图形渲染管线 <Render-Time Rendering Third Editi ...

  8. cg语言学习&&阳春白雪GPU编程入门学习

    虽然所知甚少,但康大的<GPU编程与Cg编程之阳春白雪下里巴人>确实带我入了shader的门,在里面我第一次清晰地知道了“语义”的意思,非常感谢. 入门shader,我觉得可以先读3本书: ...

  9. OpenGL渲染管道,Shader,VAO&VBO&EBO

    OpenGL渲染管线 (也就是)OpenGL渲染一帧图形的流程 以下列举最简单的,渲染一个三角形的流程,你可以将它视为 精简版OpenGL渲染管线 更复杂的流程也仅仅就是:在此基础上的各个流程中 添加 ...

随机推荐

  1. 【BZOJ3505】[Cqoi2014]数三角形 组合数

    [BZOJ3505][Cqoi2014]数三角形 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. ...

  2. 【BZOJ4561】[JLoi2016]圆的异或并 扫描线

    [BZOJ4561][JLoi2016]圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一 ...

  3. 九度OJ 1140:八皇后 (八皇后问题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:795 解决:494 题目描述: 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * ...

  4. Struts2中的redirect参数传递

    在Action之间传递参数有如下方法: (方法一): Xml代码 1. <result name="topic" type="redirect">f ...

  5. React Native 隐藏组件思路

    In your render function:{ this.state.showTheThing && <TextInput/>} Then just do: this. ...

  6. 将自定义参数从uboot传入kernel的并读取的方法【转】

    本文转载自:http://blog.csdn.net/qq_29729577/article/details/50580727 希望朋友们多多指点,好的技术或心得一起分享: uboot向kernel传 ...

  7. 使用idea导入远程git版本库项目

    1.选择git方式导入 2.设置远程git项目地址 3.测试是否连接成功 4.选择yes,检查项目 5.如果有下一步,直接next下去就可以了.

  8. Rsync+Sersync同步

    Rsync+Sersync同步特点: (1):sersync可以记录下被监听目录中发生变化的(包括增加.删除.修改)具体某一个文件或某一个目录的名字:(2):rsync在同步的时候,只同步发生变化的这 ...

  9. Linux命令学习笔记- vmstat命令实战详解

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...

  10. Jmeter 在什么情况下定义多个thread group?

    Jmeter里面有三种线程组:setUp thread group, TearDown thread group, thread group. 如果想定义100个用户登录系统,60个用户做A操作,40 ...