给定物体的三维模型,想实现线消隐,但又不愿做看起来很复杂的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吧?
问题二,为什么这样实现呢。。