GPU是怎么生成图像的,具体过程是啥?
百度上都是复制粘贴,说法也不统一,就很烦 简单点说,游戏中的所有物体基本都是三角形组成的,这些三角形 通过一个矩阵变换(透视变换,让产生近大远小的效果),映射到屏幕的二维坐标,这些二维化的三角形通过光栅化(相当于填充三角形内部的像素)获得三角形的每个像素,每个像素 再通过纹理贴图(三角形有了颜色效果),就最终生成了你看到的屏幕上的效果 如果你是指三维空间的物体怎么变换到屏幕上,那么我可以概括如下:假设现在有一个空间三角形需要投影到屏幕上。
这个过程涉及到摄像机的位置和方向,摄像机的内参(如焦距),三角形的位置。一旦这些变量确定,如果三角形在摄像机视野范围内,那么你可以在摄像机屏幕上得到一个三角形的投影。投影方法可以简单的理解为,连接空间点和摄像机的位置得到一条直线,这条直线和屏幕的交点就是投影点。
关于如何用像素把这个三角形表示出来(称作光栅化)。其实就是判断一个点是否在三角形内,如果在三角形内,那么这个像素需要被着色。着色方法可以使用插值实现。 一、先介绍下图像在计算机的表现方式:
1、在计算机中(pc和移动),图像一般认为是一个二维数组,比如经常说的1080p(一般指分辨率为1920x1080这么个矩形的二维数组,单位是像素);
2、一个像素一般由RGB三基色组成(红绿蓝三基色,可以通过配比调制出各种颜色)。
3、所以你的问题现在是不是可以理解为:GPU是如何生成一张每个像素点是RGB三基色的二维举证
二、紧接着,说下GPU生成图像的一种典型思路
1、首先,如果你对内存了解的话,这小点就略过,计算机中,一般一张图像是存在内存里面的,一般RGB是24bit的,也就是3个byte(当然还可以用其他更丰富的表示方法)。所以一张RGB24的裸数据图像需要大约6m的内存来存储。
2、为了生成这样一张图像,简单的一个思路是每个像素设定一个坐标,然后给每个坐标填充数值。上面讲到的RGB3个字节,一个字节是8bit,能用来表示0-255的数值,所以填充的时候假设三个字节分辨填255,0,0。那么这个像素就是红色了(一般液晶屏上面每个像素有三个很小的发光管,三个基色就可以组合成不同的颜色)。
3、宏观上来说,GPU其实可以认为有几百甚至上万个简单的cpu核心组成的。事实上也是这样的,只不过在实现的细节非常复杂(为了跑得快,又省电)。
4、所以GPU就是同时可以操作几百上万个像素。这是就需要算法参与进来了。一般算法会根据输入的数据,根据不同的坐标,然后计算出一个像素(或者多个像素)。
5、例如,如果是生成一张颜色渐变的图像,其实就是根据坐标就能实现了,每一列的颜色渐渐变化就能生成了。
三、跟CPU的区别
1、CPU也可以生成图像,只不过在很多场合,CPU处理图像的能力比较弱,所以就衍生出来了专用的图像处理模块,被称为GPU。
2、CPU在逻辑控制上比较强大,而GPU为了实现同时几百个核同时跑,所以每个核都更注重计算能力,逻辑控制能力很差。比如说:如果a大于b,显示红色像素,如果a小于b,显示蓝色;如果a等于b,显示绿色。这个;逻辑在CPU上处理比较快,因为CPU只处理其中一种情况;但是在GPU里面是三种情况都处理,然后选择一个结果。
3、所以CPU和GPU只不过是各自有各的优劣势而已。
四、GPU的编程实现图像
1、为了实现二的思路方法有很多。因为软件开发发展很快,目前业内比较多的GPU编程方式主要有几种工业标准接口:OpenGL/ES,OpenCL,metal,vulkan,directx等。但是说白了,这些只不过是抽象了一个层面,叫做应用程序开发接口(API)。
2、无外乎,GPU生成图像最终还是归结为ALU(计算单元)用于计算算法,寄存器用于存储临时结果;内存用于存储最终结果,所以GPU生成图像的本质就是根据一个公式,生成不同的像素,通过像素组合成一张图案。
3、当然,为了加速这些实现GPU可能会引入各种各样的加速模块。但是说白了还是由计算单元和存储组成的专一小模块。
五、上述讲到的图像是以裸数据为例
1、如果图像最终要通过网络,u盘等介质进行传播的话,需要对那个二维数据进行封装(说白了是加一些头部,让其他计算机也能识别。比如说加一些信息,张图像是1920x1080个像素,每个像素是3个字节组成等等)和压缩(为了减少存储)
希望对你有帮助。
页:
[1]