渲染流水线的起点是CPU,即应用阶段。

  1)把数据加载到显存中

  2)设置渲染状态,通俗说这些状态定义了场景中的网格是怎样被渲染的。

  3)调用DrawCall,一个命令,CPU通知GPU。(这个命令仅仅会指向一个需要被渲染的图元列表,并不会包含材质信息,因为在上一阶段已经完成)

CPU流水线  GPU从CPU那里得到渲染命令后,就会进行一系列流水线操作,最终把图元渲染到屏幕上。

   几何阶段:

        顶点着色器/曲面细分着色器/几何着色器

        裁剪(Clipping):将不在视野范围内的顶点裁减掉,这阶段可配置的,但是不可编程。

        屏幕映射:负责把每个图元的坐标转换到屏幕坐标系中。 该阶段不可配置,编程。

     光栅化阶段:

        三角形设置:计算光栅化一个三角形网格锁需要的信息。 不可编程,不可配置。

        三角形遍历:会检查每个像素是否被一个三角形锁覆盖。如果被覆盖,就会生成一个片元(fragment)。而这样一个找到哪些被三角形网格覆盖的过程就是三角形遍历。不可编程,不可配置。

        片元着色器:可编程着色器。在DirectX中,片元着色器被称为像素着色器。

        逐片元操作:最后一步。在DieectX中,称为输出合并阶段。

CG语言    

    根据平台不同,编译成相应的中间语言。 CG语言的跨平台型很大原因取决于跟微软合作。   

DrawCall 优化 ,可以理解为,1000个1k的文件复制和一个1000k的文件复制。显然是一个文件复制的快。

如果DrawCall数量太多,CPU就会把大量时间浪费在提交DrawCall上,造成CPU过载。

        

    

Shader 入门笔记(二) CPU和GPU之间的通信的更多相关文章

  1. Shader 入门笔记(二) CPU和GPU之间的通信,渲染流水线

    渲染流水线 1)应用阶段(CPU处理) 首先,准备好场景数据(摄像机位置,视锥体,模型和光源等) 接着,做粗粒度剔除工作. 最后,设置好每个模型的渲染状态(使用的材质,纹理,shader等) 这一阶段 ...

  2. Shader 入门笔记(一)

    本笔记,是根据自己学习shader的笔记,主要是参照冯乐乐的<Shader 入门精要> 和游戏蛮牛shaderLad视频 和网上一些博客. 为啥要学习这个呐? 自己其实之前学过一段时间的s ...

  3. Shader 入门笔记(一) 如何学习shader

    本笔记,是根据自己学习shader的笔记,主要是参照冯乐乐的<Shader 入门精要> 和游戏蛮牛shaderLad视频 和网上一些博客. 为啥要学习这个呐? 自己其实之前学过一段时间的s ...

  4. OpenCL入门:(二:用GPU计算两个数组和)

    本文编写一个计算两个数组和的程序,用CPU和GPU分别运算,计算运算时间,并且校验最后的运算结果.文中代码偏多,原理建议阅读下面文章,文中介绍了OpenCL相关名词概念. http://opencl. ...

  5. 10月9日Android学习笔记:活动与服务之间的通信

    最近在照着<第一行代码>这本书来学安卓,顺便记下笔记.主要的内容是Android中服务的第二种启动方式,通过活动绑定服务来启动服务,实现活动与服务之间的通信. 一. 首先创建一个服务类 p ...

  6. Shader 入门笔记(三) ShaderLab 初识

    Unity中,Unity Shader 都是ShaderLab 来编写的.ShaderLab 是Unity提供的编写Unity Shader 的一种说明性语言. 1)Properties :定义了着色 ...

  7. Redis入门笔记(二)-配置及运行

    转自: http://gly199.iteye.com/blog/1056424 1.redis基本参数 redis的配置文件中的常见参数如下: daemonize   是否以后台进程运行,默认为no ...

  8. nodeJs入门笔记(二)

    js中window通常是全局变量 global 是node.js里的全局变量 node中能访问的对象一般都是 global的 属性 global 对象属性 process 用于描述当前Node 进程状 ...

  9. Scala入门笔记二

    [TOC] 标识符 可用的字符 处理括号类字符,分隔符之外,其他所有的可打印的ASCII字符,如字母,数字,下划线和美元符号($)均可出现在Scala标识符中 插入符包括了(,) [,] {,and} ...

随机推荐

  1. 基于PDO的简易ORM

    #基于PRO的一个简单地ORM GitHub 项目地址 #在用原生写脚本的时候怀念起框架中封装好的ORM,所以仿照laravel写了这个简洁版的ORM,可以链式操作. #实现功能 ###条件函数 ta ...

  2. 类Unix平台程序调试

    GNU Binutils GNU Binutils 建立main.c文件,内容如下: #include <stdio.h> void main() { int a = 5/0; } 编译m ...

  3. 前端请求参数MD5加密校验,参数串解密

    首先引入MD5加密库:=>https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js; 步骤:=>1.请求前对参数进行字典升序排序,排 ...

  4. 接口自动化测试框架 (一) :APIAutoTest框架

    前言 随着测试技术的发展,接口自动化测试逐渐成为各大公司投入产出比最高的测试技术.介入时间早,执行效率高,稳定性高的优点,让越来越多的公司引入接口自动化测试. 框架简介 APIAutoTest是处理A ...

  5. 数据结构之链表-链表实现及常用操作(C++篇)

    数据结构之链表-链表实现及常用操作(C++篇) 0.摘要 定义 插入节点(单向链表) 删除节点(单向链表) 反向遍历链表 找出中间节点 找出倒数第k个节点 翻转链表 判断两个链表是否相交,并返回相交点 ...

  6. 学习笔记 - 用js判断页面是否加载完成实现代码

    用document.onreadystatechange的方法来监听状态改变, 然后用document.readyState == "complete"判断是否加载完成 docum ...

  7. CTF---密码学入门第六题 古典密码

    古典密码分值:10 来源: 北邮天枢战队 难度:易 参与人数:5115人 Get Flag:1549人 答题人数:1783人 解题通过率:87% 密文内容如下{79 67 85 123 67 70 8 ...

  8. Kruscal(最小生成树)算法模版

    ;//最大点数 ;//最大边数 int n,m;//n表示点数,m表示边数 struct edge{int u,v,w;} e[maxm];//u,v,w分别表示该边的两个顶点和权值 bool cmp ...

  9. 什么是 core dump ? 以及如何使用gdb对 core dumped 进行调试

    什么是core dump?(down = 当) core的意思是:内存,dump的意思是:扔出来.堆出来. 开发和使用linux程序时,有时程序莫名其妙的down掉了,却没有任何的提示(有时候会提示c ...

  10. 三分钟使用webpack-dev-sever搭建一个服务器

    webpack-dev-server是一个小型的Node.js Express服务器,我们可以通过它搭建一个本地服务器,并且实现文件热更新; 1.切换到你的目录下对项目进行初始化 npm init 一 ...