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. UITableView基础入门

    新建一个Single View Application 添加一个空类如下: using System; using UIKit; using Foundation; namespace BasicTa ...

  2. funhub 独立游戏团队诚邀策划,美术,技术,QA 大大加入(可远程办公)

    我们刚成立的的独立游戏团队,base:广州,团队陆陆续续已经有 6 个成员了,现在还缺的岗位有策划,美术.不过有其 他岗位的仁人志士也可加入. 另外,我们支持远程办公,这是互联网行业的天然优势,一定要 ...

  3. yield方式转移执行权的协程之间不是调用者与被调用者的关系,而是彼此对称、平等的

    def simpleGeneratorFun(): yield 1 yield 2 yield 3 for value in simpleGeneratorFun(): print(value) de ...

  4. define tensorflow and run it

    import tensorflow as tf a, b, c, d, e = tf.constant(5, name='input_a'), tf.constant(6, name='input_b ...

  5. eclipse的maven、Scala环境搭建

    最近重新搭建了一下maven+Scala的环境,发现很多东西都不记得了,于是重新记录一遍. 嫌搭建麻烦的话也可以直接下载Scala官方做好的环境http://scala-ide.org/downloa ...

  6. 不懂不能装懂--邮箱后缀“inc”的含义

    之前实习的公司,邮箱域名是XXX@XXX-inc.com 再之前,投递简历了或者关注某个公司的一些信息或者和这些公司的人邮件联系是也发现有这个inc的后缀,一直不明白,今天觉得自己找到答案了,不怕丢人 ...

  7. Objective-c继承与组合

    Objective-C 继承 继承:是一种XXX是XXX的关系.例如:学生是人,所以学生与人就是继承的关系. #import <Foundation/Foundation.h> @inte ...

  8. vue项目刷新当前页面

    场景: 有时候我们在vue项目页面做了一些操作,需要刷新一下页面. 解决的办法及遇到的问题: this.$router.go(0).这种方法虽然代码很少,只有一行,但是体验很差.页面会一瞬间的白屏,体 ...

  9. HDU5950 Recursive sequence —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-5950 Recursive sequence Time Limit: 2000/1000 MS (Java/Others)   ...

  10. 安装Nginx四层负载均衡

    Nginx1.9开始支持tcp层的转发,通过stream实现的,而socket也是基于tcp通信. stream模块默认不安装的,需要手动添加参数:–with-stream,官方下载地址:downlo ...