1. OpenGL的反饋機制
反饋和選擇具有一個相似之處,在這兩種模式下,不會產生任何像素,並且屏幕被凍結。
在選擇模式下,一些已分配的名稱被返回到一個整形數組中;在反饋模式下,與經過變換的圖元有關的一些信息被返回到一個浮點型數組中。
2. 使用步驟
//在繪製了場景之後,開始進入以下代碼
(1)
GLfloat feedBuffer[1024];
//指定保存反饋數據的數組,GL_3D_COLOR表示返回的頂點數據由座標(x,y,z)和顏色(r,g,b,a)組成
glFeedbackBuffer(1024, GL_3D_COLOR, feedBuffer);
(2)
glRenderMode(GL_FEEDBACK); //進入反饋模式
(3)
//繪製兩條線
glBegin(GL_LINE_STRIP);
glNormal3f( 0.0, 0.0,1.0);
glVertex3f(30.0, 30.0, 0.0);
glVertex3f(50.0, 60.0, 0.0);
glVertex3f(70.0, 40.0, 0.0);
glEnd();
glPassTrough(1.0); //在圖元之間增加標記
//繪製一個點
glBegin(GL_POINTS);
glNormal3f(0.0, 0.0, 1.0);
glVertex3f(50.0, 50.0, 0.0);
glEnd();
glFlush();
(4)
GLuint size = glRenderMode(GL_RENDER); //返回繪製模式,同時獲得返回的圖元的個數
(5)
//處理返回的圖元數組
GLuint count = size;
GLfloat token;
while( count )
{
//獲取反饋數據的第一個字節,是一個表示圖元類型的代碼
//可以是GL_POINT_TOKEN, GL_LINE_TOKEN等等
token = buffer[size - count];
count--;
if( token == GL_PASS_THROUGH ) //如果圖元是插入的標記
{ count--; }
else if( token == GL_POINT_TOKEN ) //如果圖元是點,則移動7個位置(x,y,z,r,g,b,a)
{ count -= 7; }
else if( token == GL_LINE_TOKEN ) //如果圖元是線,則移動14個位置(2個點的數據)
{ count -= 14; }
else if( token == GL_LINE_RESET_TOKEN ) //如果圖元是線,切對於點畫模式進行了重置
{ count -= 14; }
}