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. Mvc创建并注册防盗链

    创建CustomHandler.JpgHandler public class JpgHandler : IHttpHandler { public void ProcessRequest(HttpC ...

  2. 点击其它地方关闭DIV

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. live555中fDurationInMicroseconds的计算

    live555中fDurationInMicroseconds表示单个视频或者音频帧所占用的时间间隔,也表示在fDurationInMicroseconds微秒时间后再次向Source进行getNex ...

  4. Spring整合Hibernate的方法

    一.基本支持 Spring 支持大多数流行的 ORM 框架, 包括 Hibernate JDO, TopLink, Ibatis 和 JPA. Spring 对这些 ORM 框架的支持是一致的, 因此 ...

  5. Interface AutoCloseable

    https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html https://docs.oracle.com/javase ...

  6. Xcode6 新特性

    苹果在WWDC 2014上对新版Xcode(Xcode 6 Beta版)并没有提及过多.但它却是开发人员不能忽视的一部分.Xcode 6 Beta版为设计和创建软件引入了新方法,更加关注功能和一些改善 ...

  7. Linux就该这么学--命令集合1(常用系统工作命令)

    1.用echo命令查看SHELL变量的值(前面有$符号): echo $SHELL 2.查看本机主机名: echo $HOSTNAME 3.查看当前的系统时间: date 4.按照“年-月-日 时:分 ...

  8. Hibernate总结(转)

    原文:http://blog.csdn.net/yuebinghaoyuan/article/details/7300599 那我们看一下hibernate中整体的内容: 我们一一介绍其中的内容. H ...

  9. Android在有存储卡和无存储卡情况下拍照后固定尺寸和压缩大小

    我最近工作挺忙,距离上一次写博客转眼已经过了一个多月,每次学到和用到点新东西,其实都有分享的欲望,但奈何文笔太差,而一篇文章包括构思,排版,修改发布的时间最少要花费2个小时(这其中还不包括写完后未保存 ...

  10. 使用webpack4搭建一个基于Vue的组件库

    组内负责的几个项目都有一些一样的公共组件,所以就着手搭建了个公共组件开发脚手架,第一次开发 library,所以是参考着 iview 的配置来搭建的.记录如何使用webpack4搭建一个library ...