一、什么是OpenGL/DirectX
我们直接访问GPU是一件非常麻烦的事情,可能需要各自寄存器、显存打交道而图像编程接口在这些硬件的基础上实现了一层抽象。
OpenGL和DirectX就是这些图像应用编程接口,这些接口用于渲染二维或三维图形。这些接口架起了上层应用程序和底层GPU的沟通桥梁。一个应用程序向这些接口发送渲染接口发送渲染命令,而这些接口会依次向显卡驱动发送渲染命令,这些显卡驱动真正知道如何和GPU通讯的角色,正是他们OpenGL或DirectX的函数调用翻译成了GPU能够听懂的语言,同时它们也负责把纹理等数据转换成GPU所支持的格式,一个比喻就是,显卡驱动就是显卡的操作系统。下图显示了这样的关系:
概括来说我们的应用程序在CPU上,应用程序可以通过调用OpenGL或DirectX的图像接口将渲染所需的数据,如顶点数据、纹理数据、材质参数等数据存储在显存中的特定区域。随后开发者可以通过图形编程接口发出渲染命令,这些渲染命令也被称为Draw Call,它们将会被显卡驱动翻译成GPU能够理解的代码,进行真正的绘制。
由上图可以看出,一个显卡除了有图像处理单元GPU外,还拥有自己的内存,这个内存通常被称为显存,GPU可以在显存中存储任何数据,但对于渲染来说一些数据类型是必需的,例如用于屏幕显示的图像缓冲、深度缓冲等。
因为显卡驱动的存在,几乎所有的GPU都既可以和OpenGL合作,也可以和DirectX一起工作。从显卡角度出发,实际上它只需要和显卡驱动打交道就可以了。而显卡驱动就好像一个中介者,负责和两方(图像编程接口和GPU)打交道。因此一个显卡制作商为了让他们的显卡可以同时和OpenGL、DirectX合作,就必须支持OpenGL和DirectX接口的显卡驱动。
二、什么是HLSL、GLSL、CG
我们之前降到了很多可编程的着色器阶段,如顶点着色器、片元着色器等。这些着色器可编程行在于,可以使用一种特定的语言来编写程序,