麦博士 的blog

浅谈 GPU图形固定渲染管线

图形渲染管道被认为是实时图形渲染的核心,简称为管道。管道的主要功能是由给定的虚拟摄像机、三维物体、灯源、光照模型、纹理贴图或其他来产生或渲染一个二维图像。由此可见,渲染管线是实时渲染技术的底层工具。图像中物体的位置及形状是通过它们的几何描述、环境特征、以及该环境中虚拟摄像机的摆放位置来决定的。物体的外观受到了材质属性、灯源、贴图以及渲染模式(sharding modles)的影响。

很多计算机图形学的书籍都把渲染管线分为三个阶段:应用程序阶段、几何阶段、光栅化阶段。

1. 应用程序阶段(CPU)

应用程序阶段,通过高级编程语言(C、C++、JAVA)进行开发,与CPU、内存打交道,主要任务是识别出潜在可视的网格实例,并把它们及其材质呈交给图形硬件以供渲染。在该阶段的末端将产生几何体数据,包括顶点坐标、法向量、纹理坐标、纹理等,通过数据总线传送到图形硬件以供渲染(时间瓶颈),进行几何阶段。应用程序阶段负责驱动GPU管道,在该阶段有三个角色:
1.可见性判别:仅把可见(或至少潜在可见)的物体提交GPU,以免浪费宝贵的资源去渲染看不见的物体。(裁剪?)

CPU VS GPU,Core Animation是如何在这两个处理器之间分配工作的?

CPU VS GPU

关于绘图和动画有两种处理的方式:CPU(中央处理器)和GPU(图形处理器)。在现代iOS设备中,都有可以运行不同软件的可编程芯片,但是由于历史原因,我们可以说CPU所做的工作都在软件层面,而GPU在硬件层面。

总的来说,我们可以用软件(使用CPU)做任何事情,但是对于图像处理,通常用硬件会更快,因为GPU使用图像对高度并行浮点运算做了优化。由于某些原因,我们想尽可能把屏幕渲染的工作交给硬件去处理。问题在于GPU并没有无限制处理性能,而且一旦资源用完的话,性能就会开始下降了(即使CPU并没有完全占用)

大多数动画性能优化都是关于智能利用GPU和CPU,使得它们都不会超出负荷。于是我们首先需要知道Core Animation是如何在这两个处理器之间分配工作的。

动画的舞台

Core Animation处在iOS的核心地位:应用内和应用间都会用到它。一个简单的动画可能同步显示多个app的内容,例如当在iPad上多个程序之间使用手势切换,会使得多个程序同时显示在屏幕上。在一个特定的应用中用代码实现它是没有意义的,因为在iOS中不可能实现这种效果(App都是被沙箱管理,不能访问别的视图)。

科普:GPU是如何工作的?与CPU、DSP有什么区别?

GPU是显示卡的“心脏”,也就相当于CPU在电脑中的作用,它决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。

2D显示芯片在处理3D图像和特效时主要依赖CPU的处理能力,称为“软加速”。3D显示芯片是将三维图像和特效处理功能集中在显示芯片内,也即所谓的“硬件加速”功能。显示芯片通常是显示卡上最大的芯片(也是引脚最多的)。GPU使显卡减少了对CPU的依赖,并进行部分原本CPU的工作,尤其是在3D图形处理时。GPU所采用的核心技术有硬体T&L、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬体T&L技术可以说是GPU的标志。

工作原理

【科普】 GPU是如何工作的?

早在1990年,无处不在的交互式3D图形还只是科幻小说里的东西。十年后,基本上每台新电脑都包含一个图形处理单元(GPU,即Graphics processing unit)。直到今天,GPU的原始计算能力已经超越最强大的CPU,并且差距还在稳步增大。今天,GPU可以直接使用图形硬件来实现许多并行算法。那些利用底层计算能力的适当的算法常常会获得巨大的速度提升。

任何3D图形系统的任务都是根据一个场景的描述来合成一张图片 --- 对实时渲染图形学(例如游戏)来说是每秒60张。这个场景包含了可观察的几何图元以及灯光照亮场景的描述,每个对象反射光照的方式和观察者的位置、朝向。

图形管线输入

大多数实时图形系统假设所有东西都是由三角形组成的,它们首先将任何复杂的形状(例如四边形,曲面)划分为三角形。开发者使用图形库(例如OpenGL或者Direct3D)将每个三角形传递给图形管线,每次传递一个顶点,GPU根据需要将顶点组合成三角形。

模型转换

GPU与GPGPU泛淡

GPU与GPGPU泛淡

GPU(Graphics Processing Unit),也即显卡,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上作图像运算工作的微处理器。它已经是个人PC和移动设备上不可或缺的芯片,有界面有显示的地方,一般就离不开它。高清电视、智能手机、个人电脑。

GPU的产生是为了解决图形渲染效率的问题,但随着技术进步,GPU越来越强大,尤其是shader出现之后(这个允许我们在GPU上编程),GPU能做的事越来越多,不再局限于图形领域,也就有人动手将其能力扩展到其他计算密集的领域,这就是GP(General Purpose)GPU。

考虑到当下,图形领域的技术人员对GPU已经是很熟悉了,其他那些关心GPU的,无非是向往GPU的强大并行运算能力,想利用它做通用计算的,因此,本文会特别提GPGPU。

架构与生态

【笔记】MIPS 初探

1. MIPS32 汇编

1.1 寄存器

MIPS 中大量使用寄存器,原因是寄存器的存取可以在一个时钟周期内完成,同时也简化了寻址方式。MIPS 的指令中除加载/存储指令外,都是使用寄存器或立即数作为操作数的。寄存器可分为两类:通用寄存器与特殊寄存器。

1.1.1 通用寄存器(GPR)

MIPS32 架构中定义了 32 个通用寄存器,都是 32 位,使用 $0、$1 ... $31 表示,也可以使用约定命名表示,如 $sp、$a0、$v0、$ra 等。下表显示了各个通用寄存器的约定用法。

编号 约定命名 约定用法

0

zero

PIC32MZ——USB HID通信

在设备通信中,UART非常常见,也是最简单的,但是,PC尤其是笔记本基本都舍弃了传统的UART端口,只能使用usb转UART的IC来做信号转换,这样效率低,而且还要针对IC安装专门的驱动,非常不方便,而在有些特殊设备上,甚至驱动无法安装,是否可以不安装驱动与PC通信呢?

当然可以!

在USB盛行的今天,USB通信变得极其简单,而在USB中有一个重要的通信标准,就是HID(Human Interface Device),常见的鼠标键盘就是采用HID通信。由于它的标准性,几乎所有PC系统(Windows、Linux、OSX)都集成了它的驱动,所以,可以将它看做一个免驱的设备,类似的还有USB大容量存储。下面我们就用PIC32MZ2048EFH芯片实现USB HID的接口(PIC32MZ EF Start Kit开发板),与PC进行通信,PC端采用C#以及C++分别在windows和linux下实现hid读写,本篇不做描述,详细参考我的其它博客,关于两个平台的hid程序。

接口使用的是micro usb(j4接口)。

1、配置时钟(略)

2、配置USB Library,下图中红色部分要修改,其它默认。

PIC32MZ——OLED12864 I2C显式示例

本篇主要讲述如何使用PIC32MZ来点亮OLED12864。

OLED12864可以控制一个一个像素点,所以需要自建字库,有专门生成的软件,字库为字母字符,放到最后面。注意不同12864排列或者共极不同,则需要自行取模。

 PIC32MZ——OLED12864 I2C显式示例

本片需要调用I2C通信中的基础代码,需要delay和i2c-Hardware,以下不再贴这部分代码。

第一部分是字模文件

codetab.h

#ifndef _CODETAB_H  
#define _CODETAB_H  
  
  
/***************************16*16 Chinese, common gnd - column style - reverse output*********/  
extern uint8_t F16x16[];  
  

PIC32MZ——I2C通信

I2C跟串口一样,仅需2根线通讯即可,在某些引脚紧张的应用中非常有用,不过I2C相比于串口,通讯协议更简单一点,距离也更短一些,仅限于板间通信。大多数IC都支持I2C协议。

I2C的时序图为:

PIC32MZ——I2C通信

I2C数据传输是在起始条件和停止条件之间。

起始条件和停止条件都是SCL为高一段时间产生。起始条件为SDA从高变为低,停止条件为SDA从低变为高。

I2C数据传输规则为,第一字节必须为地址,一般器件地址都是7位(也有10位的),放在高7位,最后一位时读写标识,所以,读写地址是不相同的,并且很多IC都可以配置多个地址选择,这是为了在一组I2C上接多个IC,因为I2C是通过地址来识别从机的。

每传输一个字节,从机都要回复一个ACK来表示是否完成接受,回复0继续接受,回复1停止接受。

I2C写操作很简单,传输从机地址以及数据即可。

I2C读也是一样,传输从机地址即可。

写操作:

PIC32MZ——PWM呼吸灯

PWM类似于开关电源,将高电压中间插入地脉冲,来将有效电压降低,在某些电压不敏感器件中,可以实现电压降低的效果。例如LED的亮度变化。

前文有说过,Harmony的Dynamic还不是很完善,在PWM上就有体现,PWM需要OC与静态Timer配合,如果有其它Timer在在使用Dynamic,不想全部改为Static,可以直接使用PLIB函数,可以从其它Static函数往底层去看,也是通过static调用的PLIB函数。

所以,在这里我们只配置OC,而对应的Timer则采用直接调用底层函数的方法使用static驱动。

注意,PWM的占空比指的是高电位占空比,例如80%指的是80%为高电位。

1、配置驱动


2、配置输出引脚

同步内容
--电子创新网--
粤ICP备12070055号