3D游戏的一帧画面是如何显示的
3D游戏的一帧画面是如何显示的

3D游戏一般使用图形渲染引擎实现,而图形渲染引擎调用的是图形渲染API。常见的图形渲染API包含:OpenGL、OpenGL ES、Vulkan、DirectX等。
图形渲染API定义了每个API需要实现的功能,而功能的实现是由GPU厂商完成的。有的时候会出现同样的程序在不同的GPU上运行的结果不一致,这是因为不同GPU对某个API的实现不一样或者就完全没有实现。
在使用GPU的硬件渲染图像之前,驱动会解析图形渲染API并做一些预处理。这里的驱动包含用户态驱动和内核态驱动。
通常,用户态驱动与图形渲染API是一一对应的,也就是说,如果某GPU支持OpenGL和DirectX,那么其必须提供OpenGL的用户态驱动和DirectX的用户态驱动。在Linux操作系统下,OpenGL的用户态驱动就是libGL.so。用户态驱动对图形渲染API进行解析、缓存和处理。为了提升图形渲染效率,用户态驱动可以直接将一些大块的数据和控制信息事先写入GPU的显存中。
内核态驱动可以直接和硬件打交道,如读写寄存器、存储访问、中断控制等。一个GPU硬件只有一个内核态驱动,它屏蔽了不同用户态驱动的差异,提供统一的与硬件交互的接口。
内核态驱动通过系统总线给GPU提供输入,然后GPU进行渲染,接着GPU将渲染后的结果写入显存中的帧缓冲区中,最后,显控按照一定的频率读取帧缓冲区的内容显示到显示器上。
那么GPU是怎样根据CPU的输入渲染出一帧图像的呢?
我们首先看一下CPU给GPU的输入数据都有哪些:1)顶点数据、染色程序、纹理数据等;2)配置数据;3)控制数据。#1是用户态驱动直接写入显存的,是图形渲染的原始数据;#2是内核态驱动写入GPU的配置寄存器,通过这种方式可以配置硬件资源;#3一部分是用户态驱动写入内存,一部分是内核态驱动写GPU的控制寄存器,通过这种方式可以控制GPU的运行状态。
当GPU接收到开始运行的命令,则启动其硬件渲染管线。硬件渲染管线通常包含:顶点抓取、顶点处理、图元生成、图元处理、片段生成、片段处理。顶点处理即顶点染色,片段处理包含片段染色和片段操作。片段操作又包含深度模板测试、混合等操作。其中顶点染色和片段染色是可编程的,其他阶段由固定功能的硬件加速器完成。片段操作之后生成最终的像素,然后像素数据被写入帧缓冲区中。关于渲染管线的更多描述参看:
https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview