8.1.1 当前光栅位置
当前光栅位置就是开始绘制下一幅位图(或图像)的屏幕位置。在前面这个F例子中,光栅位置是通过以坐标(20,20)为参数调用glRasterPos*()函数而设置的,它就是屏幕左下角开始绘制F的地方:
glRasterPos2i(20, 20); |
设置当前的光栅位置。x、y、z和w参数指定了光栅位置的坐标。如果使用的是这个函数的向量形式,coords参数包含了光栅位置的各个光标。如果使用的是glRasterPos2*(),z被隐式设置为0,w被隐式设置为1。类似,如果使用的是glRaster3*(),w被设置为1。
光栅位置的坐标被变换为屏幕坐标,就像以它为参数调用了glVertex*()函数一样(也就是说,用模型视图和投影矩阵进行变换)。在变换之后,它或者定义了视口中一个有效的点,或者由于位于视景体的外部而被裁剪掉。如果经过变换的点被裁剪掉,当前的光栅位置就是无效的。
在1.4版本之前,如果我们想根据窗口坐标(屏幕坐标)来指定光栅位置,必须设置模型视图和投影矩阵来实现简单的2D渲染。我们使用类似下面这样的代码,其中width和height表示视口的大小(以像素为单位):
原书第306页
代码
在1.4版本中,glWindowsPos*()函数是作为glRasterPos*()函数的替代品被引入的。glWindowsPos*()用窗口坐标指定当前光栅位置,而不必把它的x和y坐标通过模型视图和投影矩阵进行变换,也不会被裁剪出视口区域。glWindowsPos*()使我们更容易混合使用2D文本和3D图形,而不必在各种变换状态之间反复切换。
void glWindowsPos{23}{sifd}(TYPE x, TYPE y, TYPE z); |
设置当前光栅位置,以窗口坐标x和y为参数,不必进行矩阵变换、裁剪或纹理坐标生成。z值被变换为(并截取为)由glDepthRange()函数所设置的当前近侧平面值和远侧平面值。如果使用的是向量形式,coords数组包含了光栅位置的各个坐标。如果使用的是glWindowPos2*(),z被隐式设置为0。
为了获取当前的光栅位置(不管由glRasterPos*()设置还是由glWindowsPos*()设置),可以用GL_CURRENT_RASTER_POSITION为第一个参数调用查询函数glGetFloatv(),它的第二个参数应该是个指针,指向保存了(x,y,z,w)值(浮点数形式)的数组。以GL_CURRENT_RASTER_POSITION_VALID为第一个参数调用glGetBooleanv()可以确定当前的光栅位置是否有效。
| 回书目 上一节 下一节 |


























