写在前面
啦啦啦,搞了很久的Unity Shaders,越学越觉得基础知识很重要。学Unity Shader的时候,总会想,shader到底是什么呢?shader的pipeline是什么呢?它们是怎么工作的?有哪些限制?等等问题。但这些问题,Unity是不负责告诉你的。它专注于how,而不是what和why。想要深入理解一些问题,感觉还是要从GL或者DX学起。后面会学习GL龙书第八版~当然Unity我也不会放弃的。
这篇文章旨在回答一些基本问题。We always rant about them...
什么是OpenGL
这个问题很简单,它就是应用程序接口,也就是API,用于访问图形硬件中的可编程特性。OpenGL和DX相比有一个很大的特点就是跨平台的特性。换句话说,它是不依赖硬件的接口,可以运行在各种不同类型的图形硬件系统上,甚至完全是一个软件(而没有图形硬件)。
OpenGL是一种客户端-服务器(client-server)类型的系统。我们编写的程序就是一个客户端,而我们的计算机图形硬件制造商提供的OpenG的实现就是服务器。在一些OpenGL的实现里(例如一些和X Window System相关的应用),客户端和服务器可能会在不同的机器上运行,中间用网络连接。在这种情况下,客户端可以发起OpenGL命令,然后转换成窗口系统特定的协议,再发送给服务器,最终在服务器上执行OpenGL进行图像显示。
为什么OpenGL不提供窗口操作
这个问题我经常会问。。。为什么写个GL还要用这么多第三方库!连个窗口都不能自己画吗!这其实不能怪OpenGL,这正是它的优点——跨平台的特点造成的。因为它可以不依赖硬件和系统,因此就不会包含执行窗口任务的函数,或者处理用户输入等。这些函数是由我们使用的应用或系统来提供。
为什么OpenGL没有读取三维模型或者图片的函数
我以前经常抱怨,发展这么多年的OpenGL,怎么连读取三维模型这么简单的画图需求都不提供呢!!!好吧,这也是它的跨平台特性造成的。和上一点一样,这些操作是和系统存储格式密切相关的,OpenGL不管的~我们必须从点、线、三角形和patches这样的几何图元集合中自己构建三维对象。
什么是Shader
这是一类在图形硬件上执行的特殊函数。我们可以理解成,Shader是一些为图形处理单元(GPU)编译的小程序。OpenGL包含了编译工具来把我们编写的Shader源代码编译成可以在GPU上运行的代码。在OpenGL中,我们可以使用四种shader阶段。最常见的就是vertex shaders——它们可以处理顶点数据;以及fragment shaders,它们处理光栅化后生成的fragments。
vertex shaders和fragment shaders是每个OpenGL程序必不可少的部分。