学习了一段时间的opengl (学会了画一个三角形…),发现绘制图形需要给定顶点坐标,然后进行着色绘制。流程如下图所示:
那么问题来了,以上都是讲如何绘制图形,那么它是怎么做到显示图像的呢?
首先我们可以将待显示的图像视为纹理。我们需要在窗口中显示该纹理图像,就需要指定一些顶点坐标以及对应的纹理坐标,这样就可以根据插值获取窗口里每个像素点对应的纹理像素值。
opengl拥有独立的坐标系,初始坐标系为三维坐标系,取值范围为[-1,1]。 对于二维图像的绘制而言,我们可以简单地忽略轴,我们要将opengl标准化设备坐标系上定义的点绘制到屏幕上,需要进行视口变换。视口变换就是将标准化设备坐标系下的原点映射到屏幕的中心,其余四个顶点分别映射到屏幕的四个顶点,也就是做一些缩放操作。(同时可以发现超出标准化设备坐标系定义的点是不会显示在屏幕上的,此外无论屏幕/窗口大小,能显示的坐标范围都是[-1,1](定义在标准化设备坐标系下))
接下来就可以进行图像的绘制了。我们先绘制一个矩形,然后将纹理图像贴在该矩形上。首先我们需要一些顶点坐标以及对应的纹理坐标。我们定义一组矩形区域的顶点(也就是标准化设备坐标系的四个顶点,也可以理解为窗口的四个顶点(最终是显示在这里的))。opengl的纹理坐标原点在左上角,往右往下为正方向。根据顶点的渲染顺序,我们可以定义每个顶点对应的纹理坐标。(注意:纹理坐标的范围在[0,1],如果定义了超出该范围的纹理坐标,opengl默认行为是重复该纹理图像,也可以自定义重复方式。)