相关函数介绍
1、glReadPixels:从帧缓存 里读取一个像素块
void glReadPixels(GLint x,GLint y,GLsizei width,GLsizei height,GLenum format,GLenum type, GLvoid * data);
参数x,y :指定从帧缓冲区读取的第一个像素的窗口坐标,此位置是矩形像素块的左下角
参数width,height: 指定像素矩形的尺寸;
参数format:指定像素的格式。
GL_INDEX 单个颜色索引
GL_RGB 先是红色分量,再是绿色分量,然后是蓝色分量
GL_RED 单个红色分量
GL_GREEN 单个绿色分量
GL_BLUE 单个蓝色分量
GL_ALPHA 单个Alpha值
GL_LUMINANCE_ALPHA 先是亮度分量,然后是Alpha值
GL_STENCIL_INDEX 单个的模板索引
GL_DEPTH_COMPONENT 单个深度分量
参数type:指定像素数据的数据类型
GL_UNSIGNED_BYTE 无符号的8位整数
GL_BYTE 8位整数
GL_BITMAP 无符号的8位整数数组中的单个数位
GL_UNSIGNED_SHORT 无符号的16位整数
GL_SHORT 16位整数
GL_UNSIGNED_INT 无符号的32位整数
GL_INT 32位整数
GL_FLOAT 单精度浮点数
参数data:返回的像素数据,是一个指针 ,指向存储图像数据的数组
2、glGetDoublev和glGetIntegerv函数
获得投影矩阵 和模型视图矩阵
double projection[16];
glGetDoublev( GL_PROJECTION_MATRIX, projection );
double modelview[16];
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
获得当前视口
int viewport[4];
glGetIntegerv( GL_VIEWPORT, viewport );
3、gluUnProject():获得屏幕坐标对应世界坐标
gluUnProject (
GLdouble winx, //屏幕像素坐标,以左下角为起点
GLdouble winy,
GLdouble winz,
const GLdouble modelMatrix[16], //模型矩阵
const GLdouble projMatrix[16], //投影矩阵
const GLint viewport[4], //视口
GLdouble *objx, //世界坐标
GLdouble *objy,
GLdouble *objz);
应用举例
double modelview[16], projection[16];//模型投影矩阵
int viewport[4];//视口
float ScreenZ = 1;//深度值
double objx,objy,objz;//获得的世界坐标值
glGetDoublev( GL_PROJECTION_MATRIX, projection );//获得投影矩阵
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );//获得模型矩阵
glGetIntegerv( GL_VIEWPORT, viewport ); //获得视口
glReadPixels( x, viewport[3]-y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &ScreenZ ); //获得屏幕像素对应的世界坐标深度值
gluUnProject( x, viewport[3]-y, ScreenZ , modelview, projection, viewport, &objx, &objy, &objz );//获得屏幕坐标对应的世界坐标
参考文章