Posted by: billconan | September 10, 2006

最近编OpenGL遇到的几个问题

最近在实现自己程序中的鼠标拾取功能,在选择范围的调整上面颇费了些周折。最后发现是对函数参数的理解有误造成的。
有个函数是

void gluPickMatrix(GLdouble x,GLdouble y,GLdouble width,GLdouble height,GLint viewport[4]);

它是用来根据当前鼠标选择区域生成一个相应的投影矩阵的。这里面头两个参数不是这个选择区域的左上角位置,而是整个区域的中心位置。如果错把它当成左上角,选择的区域就会斜向上有个偏移。OpenGL红宝书上没有区域选择的例子,只有一个通过鼠标点击选择的程序,因而没有说明这个问题。
同样,在颜色编码拾取的时候,要通过glReadPixel这个函数读取当前在back buffer中的颜色信息:

void glReadPixels(GLint x,GLint y,GLsizei width,GLsizei height,GLenum format,GLenum type,GLvoid *pixels);

这里面的y实际上是整个区域的左下角位置,通常也很容易被人当成是左上角。另外,这些函数的纵坐标和OpenGL环境中的纵坐标是相反的,需要进行翻折。
另外在得到一个Call List的编号的时候,这个函数:

GLuint glGenLists(GLsizei range);

可能会产生一个错误叫GL_INVALID_OPERATION,返回的值是0。OpenGL的手册上讲,这是因为在glBegin和glEnd中调用这个函数造成的。可刚好我程序里是在一个构造函数里调用的,不可能存在glBegin和glEnd。一开始我不明白,后来google出来一个gamedev的帖子,上面说,这个错误是由于调用函数的时候OpenGL环境的状态不对。它举的例子就是还没有建立OpenGL的Context的时候就读入贴图。而我这个也是在没有Context的时候就要生成Call id,所以出错了。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Categories

%d bloggers like this: