图形处理器GPU和显存

图形处理器GPU

  学习WebGL就需要学习着色器语言Shader Language和WebGL API,着色器语言和WebGL API你可以理解为是对GPU的抽象。虽然编程是软件,但并不意味着不用学习硬件 图形学编程学习硬件是为了更好的编写程序,GPU硬件开发工程师学习图形学编程是为了更好的设计硬件。先学习了数字电路和汇编语言后,在学习C语言,你会发现非常容易理解, C语言中的指针概念、Javascript中的关键字this对应的都是实际硬件CPU中物理存在的指针寄存器,加法运算对应数字电路里面常说的加法器。 着色器语言GLSL是类似C语言的一门针对GPU图形处理器的编程语言,两种语言的基本思维一致,但是着色器语言又有自身特殊性,语言的特殊的地方恰恰是GPU可编程渲染管线的真实体现 大家在编写WebGL图形系统程序时,会写到顶点着色器源码、片元着色器源码,这些语句对应的就是GPU渲染管线上的可编程顶点处理器单元、可编程片元处理器单元。使用WebGL API Framebuffer 创建镇缓存对象,从硬件的角度看,显卡是有专门的硬件存储区存储帧数据。

渲染管线

  渲染管线也称为渲染流水线,顾名思义,一批顶点数据会和流水线上的产品一样要经过渲染管线上的各个处理单元,有些环节是并行处理数据,有些环节是串行处理数据,最终处理完成后 得到的数据存入显存帧缓冲区。所有的处理单元有的支持可编程,有的不支持编程。在过去固定渲染管线时代,GPU管线上所有的环节都不支持编程,只能进行简单的参数设置,自由度太小。 随着时间的发展开始出现顶点处理环节和片元处理环节开始支持编程,可以解析着色器程序,最初编程和普通计算机编程一样采用图形学的汇编,后来发展出和C类似用于图形学编程的高级语言 着色器语言Shader Language。

GPU寄存器

  GPU寄存器是GPU的组成部分,指令寄存器、程序计数器属于控制寄存器,累加器属于运算寄存器。GPU的输入寄存器、输出寄存器、 常量寄存器、纹理采样寄存器都是专用寄存器。用来与显存进行数据通信。

显存

  显存和GPU一样是显卡的一部分,用来存储与图形相关的数据,可以对比CPU可以控制的内存理解。内存、显存都是机存取存储器RAM,临时存储数据数据,显存相比内存 数据传输速度更高,

  显存里面可以存储渲染管线处理之前的顶点,纹理贴图等原始数据,也可以存储处理之后得到的像素数据。对于WebGL而言,用户通过浏览器URL访问服务器,服务器会通过网络 把相关的数据传输到本地浏览器的存储里,也就是存储在硬盘里面,比如一张纹理贴图,你可以找到浏览器在应按上缓存的位置,当浏览器曾服务器加载完数据就会解析相关的Javascript代码 对于PCI总线而言,纹理贴图会被先加载到内存,然后再加载到显卡显存中,原始数据通过渲染管线后生成的像素数据会存储在显存中,然后通过DVI、DP或其他接口输出到显示器。

  参考第二章代码33行"var buffer=gl.createBuffer();"语句,注释是创建缓冲区对象。实际上就是浏览器Javascript解释器解析Javascript语句,在显存开辟一块空间, 作为缓冲区,用来存放顶点数据,成为顶点缓冲区对象Vertex Buffer Objects,简称VBO。对于显存是如何具体存储顶点、颜色、深度、纹理等信息,如何分配空间,是通用存储区, 还是专用存储区也写细节,可以不用管理,为了更好理解,知道一个大致过程就行。显存资源是有限的,意味着WebGL编程时,会对WebGl API作出规定,比如纹理缓存单元的数量限制。