今天做线消隐碰到的问题……

来源:互联网 发布:淘宝网logo矢量图 编辑:程序博客网 时间:2024/05/16 06:18

     给定物体的三维模型,想实现线消隐,但又不愿做看起来很复杂的BSP空间分割,于是想让OpenGL帮我完成我的目的。先检测出可以观察的明显边(就是很简单的检测,两个面夹角大于多少度或者小于多少度,那么这两个面共有的那条边就是可观察到的边,只有一个面拥有的,也是可观察边,面法线与视线几乎垂直的面上的边,……等等)。把物体模型按照背景色画(这样的目的是为了得到正确的深度缓存),然后用OpenGL把这些检测的边给画出来,这样我们可以看到线消隐后的效果。但是仅仅这样我们不知道具体是哪些边是可见的哪些是被消隐的。于是想按照这些检测出来的边的标号给边赋颜色,然后到颜色缓存中读出相应的颜色,由于颜色与边对应了,所以存在哪种颜色,那么对应的边是可见的(未被消隐的)。

     问题出在我从帧缓存中读颜色的时候竟然没有读到预想的颜色!画边的时候如此赋颜色:

     glColor3b(r,g,b);

     读出来的时候这样读:

     glReadPixels( 0, 0, m_Width, m_Height, GL_RGB, GL_UNSIGNED_BYTE, TempColorBuffer3C );

     可是结果总是不对。。。

     后来才发现,GL_UNSIGNED_BYTE读出来的颜色总是(2*r+1, 2*g+1, 2*b+1)。很奇怪。

     然后把GL_UNSIGNED_BYTE改成GL_BYTE后结果就正确了。 glColor3b(r,g,b)的原型是glColor3b(GLbyte red, GLbyte green, GLbyte blue);

     其中GLbyte在gl.h中是这样定义的 typedef signed char GLbyte;

     按照GLbyte(即signed char)设置颜色,然后按照GL_UNSIGNED_BYTE读,如果说颜色参数为负或者大于127那么读出来为0可以理解的话,那么参数为正的时候读出来的颜色是2倍+1该怎么解释呢?师兄说是为了把颜色从-127~127映射到0~255,因为GLbyte是有符号的。可是这样的话设置负数颜色也没意义,颜色范围是到了0~255,但是却只有奇数了。

     问题一,怎么实现2倍+1的,不会是if else吧?

     问题二,为什么这样实现呢。。