青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

OpenGL中的選擇和反饋

讀完此章之后,你將能夠做到:
  建立允許用戶選擇(select)屏幕區域或拾取(pick)繪制在屏幕上的物體的應用程序
  利用OpenGL的反饋(feedback)模式獲取絢染計算結果
  
  有些圖形應用程序只繪制兩維和三維物體構成的靜態圖形,另一些允許用戶識別屏幕上的物體并移動、修改、刪除或用其它方法操縱這些物體。OpenGL正是設計用于支持這些交互式應用程序的。因為繪制在屏幕上的物體通常經過多次旋轉、移動和透視變換,所以確定用戶選中了三維場景中的哪個物體會很困難。為了幫助你,OpenGL提供了一個選取機制可惟自動告訴你哪個物體被繪制在窗口的提定區域里。你可以用這個機制與一個工具例程(a special utility routine)一道決定哪個物體在用戶說明或用光標選取的區域里。
  
  選擇(selection)實際上是OpenGL的一個操作模式;反饋(feedback)是這類模式中的別一個。在反饋模式中,你用你的圖形硬件和OpenGL完成通常的絢染計算。但與用這個計算結果去在屏幕上繪制圖形相反,OpenGL返回(或反饋(feeds back))這些繪制信息給你。如果你想在繪圖儀而不是屏幕上繪制圖形,舉個例子,你就得在反饋模式繪制它們,收集繪制指令,然后將這些指令轉換為繪圖儀可以理解的命令。
  
  在選擇和反饋模式中,繪制信息返回給應用程序而不是象在絢染模式中那樣送往幀緩沖。因此,當OpenGL處于選擇或反饋模式時,屏幕將被凍結-沒有圖形出現。這一章將會在各自的節中解釋這些模式:
  
  “選擇(Selection)” 討論怎樣使用選擇模式和相關的例程以使你程序的用戶能拾取畫在屏幕上的物體。
  
  “反饋(Feedback)” 描述了怎樣獲取有關什么將被畫在屏幕上的信息和這些信息是以什么格式組織的。
  
  ---------------------------------------------------
  Section
  
  通常,當你打算使用OpenGL的選擇機制時,你首先把你的場景畫進幀緩沖,然后進入選擇模式并重新繪制這個場景。然而,一旦你進入了選擇模式,幀緩沖的內容將保存不變,直到你退出選擇模式。當你退出時,OpenGL返回一個圖元(premitives)清單,圖元可能被視見體(viewing volume)分割(記住,視見體是由當前模式視見和投影矩陣及你定義的所有裁剪面定義,裁剪面詳見"Additional Clipping Planes.")。每個被視見體圖元引出一資選擇命中(hit)。確切的說,圖元清單是作為一個取整數值的名字(integer-valued names)數組和相關的數據-命中記錄(hit record)-對應名字棧(name stack)的當前內容。當你在選擇模式下發布圖元繪制命令時向名字棧中加入名字就可建立起名字棧。這樣,當名字清單被返回后,你就可以用它來確定屏幕上的哪個圖元可能被用戶選中了。
  
  除了這個選擇機制之外,OpenGL提供了一個工具例程,以便在某些情況下通過限定在視口(viewport)一個小區域內繪制來簡化選擇。通常你可以用這個例程決定哪個物體被畫在光標附近了,這樣你就能識別用戶拾取了哪個物體。你也可以通過指定附加的裁剪面來界定一個選擇區域;詳見"Additional Clipping Planes"。因為拾取是選擇的一個特殊情況,所以本章選講選擇,然后講拾取。
  
  基本步驟
  建立名字矩陣
  命中記錄
  一個選擇的例子
  拾取
  關于編寫使用選擇的程序的提示
  
  ------------------------------------------------------------------------
  基本步驟
  
  為使用選擇機制,你得作以下幾步:
  1、用glSelectBuffer()指定用于返回命中記錄的數組。
  2、以GL_SELECT為參數調用glRenderMode()進入選擇模式。
  3、用glInitName()和glPushName()初始化名字棧。
  4、定義用于選擇的視見體。通常它與你原來用于繪制場景的視見體不同。因此你或許會想用glPushMatrix()和glPopMatrix()來保存和恢復當前的變換矩陣。
  5、交替發布圖元繪制命令和名字棧控制命令,這樣每個感興趣的圖元都會被指定適當的名字。
  6、退出選擇模式并處理返回的選擇數據(命中記錄)。
  
  后面的段落將描述glSelectBuffer()和glRenderMode()。下一節則講解名字棧的控制。
  
  void glSelectBuffer(GLsizei size, GLuint *buffer);
  指定用于返回選擇數據的數組。參數buffer是指向無符號整數(unsigned integer)數組的指針,數據就存在這個數組中,size參數說明數組中最多能夠保存的值的個數。要在進入選擇模式之前調用glSelectBuffer()!
  
  GLint glRenderMode(GLenum mode);
  控制應用程序是否進入絢染(rendering)、選擇或反饋模式。mode參數可以是GL_RENDER(默認)、GL_SELECT或GL_FEEDBACK之一。應用程序將保持處于給定模式,直到再次以不同的參數調用glRenderMode()。在進入選擇模式之前必須調用glSelectBuffer()指定選擇數組。類似的,進入反饋模式之前要調用glFeedbackBuffer()指定反饋數組。如果當前模式是GL_SELECT或GL_FEEDBACK之一,那么glRenderMode()的返回值有意義。返回值是當前退出當前模式時,選擇命中數或放在反饋數組中的值的個數。(譯者注:調用此函數就會退出當前模式);負值意味著選擇或反饋數組溢出(overflowed)。你可以用GL_RENDER_MODE調用glGetIntegerv()獲取當前模式。
  
  -------------------------------------------------------------------------------
  建立名字矩陣
  
  正如前面提到的,名字棧是返回給你的選擇信息的基礎。要建立名字棧,首先用glInitNames()初始化它,這將簡單地清空棧。然后當你發布相應的繪制命令時向其中加入整數名字。正如你可能想象,棧控制命令允許你壓入名字(glPushName()),彈出名字(glPopName()),替換棧頂的名字(glLoadName())。
  /********************************************************************/
  Example 12-1: Creating a Name Stack
  glInitNames();
  glPushName(-1);
  
  glPushMatrix(); /* save the current transformation state */
  
  /*to do: create your desired viewing volume here */
  
  glLoadName(1);
  drawSomeObject();
  glLoadName(2);
  drawAnotherObject();
  glLoadName(3);
  drawYetAnotherObject();
  drawJustOneMoreObject();
  
  glPopMatrix (); /* restore the previous transformation state*/
  /********************************************************************/
  
  在這個例子中,前兩個被繪制的物體有自己的名字,第三和第四個共用一個名字。這樣,如果第三或第四個物體中的一個或全部引起一個選擇命中,只有一個命中記錄返回給你。如果處理命中記錄時不想區分各個物體的話,可以讓多個物體共享一個名字。
  
  void glInitNames(void);
  清空名字棧。
  
  void glPushName(GLuint name);
  將name壓入名字棧。壓入名字超過棧容量時將生成一個GL_STACK_OVERFLOW錯誤。名字棧深度因OpenGL實現(implementations)不同而不同,但最少要能容納64個名字。你可以用參數GL_NAME_STACK_DEPTH調用glGetIntegerv()以獲取名字棧深度。
  
  void glPopName(void);
  彈出名字棧棧頂的那一個名字。從空棧中彈出名字引發GL_STACK_UNDERFLOW錯誤。
  
  void glLoadName(GLuint name);
  用name取代名字棧棧頂的那個名字。如果棧是空的,剛調用過glInitName()后就是這樣,glLoadName()生成一個GL_INVALID_OPRATION錯。為避免這種情況,如果棧初始時是空的,那么在調用glLoadName()之前至少調用一次glPushName()以在名字棧中放上點東西。
  
  如果不是在選擇模式下,對glPushName()、glPopName()、glLoadName()的調用將被忽略。這使得在選擇模式和正常的絢染模式下用相同的繪制代碼大為簡化。
  
  -------------------------------------------------------------------------------
  命中記錄
  
  在選擇模式下,被視見體裁剪的每個圖元引起一個選擇命中。當前一個名字棧控制命令被執行或glRenderMode()被調用后,OpenGL將一個命中記錄寫進選擇數組,如果從上一次名字棧操縱或glRenderMode()調用以來有了一個命中記錄的話。這個過程中,共用同樣名字的物體-例如:由多個圖元組成的物體-不生成多個命中記錄。當然,命中記錄不保證會被寫進數組中直到glRenderMode()被調用。
  
  除圖元之外,glRasterPos()產生的有效坐標也可以引起選擇命中。在多邊形的情況下,如果它已經被消隱掉的話不會有命中記錄出現。
  
  每個命中記錄由四項組成,依次是:
  當命中出現時名字棧中的名字數
  至上次記錄的命中以來,被視見體裁剪后的圖元的所有頂點的窗口Z坐標的 最大和最小值
  本次命中時名字棧的內容,最底元素最前。
  
  當前你進入選擇模式時,OpenGL初始化一個指針指向選擇數組的起點。每寫入一個命中記錄,指針相應更新。如果寫入一個命中記錄會使數組中值的個數超過glSelectBuffer()的size參數時,OpenGL會寫入盡可能多的記錄并設置一個溢出標志。當用glRenderMode()退出選擇模式時,這條命令返回被寫入的記錄的個數(包括一條部分記錄如果有的話),清除名字棧,復位溢出標識,重置棧指針。如設定溢了出標識則返回值是-1。

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/Crazyjumper/archive/2007/10/18/1830865.aspx

posted on 2009-09-01 06:28 RedLight 閱讀(532) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

導航

統計

公告


Name: Galen
QQ: 88104725

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

相冊

My Friend

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美波霸影院| 欧美成人第一页| 一区二区三区我不卡| 国产精品一区在线观看| 国产精品乱人伦一区二区| 国产精品超碰97尤物18| 国产精品v日韩精品| 国产精品日韩二区| 国产中文一区| 亚洲精品123区| 蜜臀91精品一区二区三区| 黄色精品网站| 亚洲人成人一区二区在线观看| 亚洲国产综合在线| 亚洲视频网在线直播| 性久久久久久久久久久久| 久久久久久久网| 亚洲高清视频在线观看| 亚洲国产裸拍裸体视频在线观看乱了中文 | 性色av一区二区三区在线观看| 久久精品国产综合精品| 欧美成年人视频| 日韩视频免费在线| 欧美一区二视频| 欧美成人精品1314www| 国产精品视频导航| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲精品国产精品乱码不99按摩 | 欧美精品激情在线| 国产精品无码专区在线观看| 在线观看一区二区视频| 亚洲天堂av在线免费观看| 久久久久久久久久久一区| 亚洲国产精品一区二区第四页av| 一区二区三区四区蜜桃| 久久久噜噜噜久久狠狠50岁| 欧美日韩在线播放一区二区| 精品福利电影| 亚洲欧美日韩人成在线播放| 你懂的视频欧美| 亚洲欧美日本视频在线观看| 欧美精品亚洲二区| 在线欧美三区| 久久人人爽人人爽爽久久| 一区二区三区四区蜜桃| 欧美精品乱人伦久久久久久 | 一本色道久久综合亚洲精品婷婷 | 一区二区三区蜜桃网| 久久免费高清视频| 国产精品伊人日日| 亚洲最快最全在线视频| 免费在线看成人av| 欧美一区二区国产| 国产精品一区二区你懂得| 亚洲精一区二区三区| 欧美freesex交免费视频| 欧美一区二区三区男人的天堂 | 性高湖久久久久久久久| 国产精品jvid在线观看蜜臀| 亚洲人成网站999久久久综合| 欧美h视频在线| 久久久亚洲综合| 一区在线免费观看| 免费av成人在线| 久久偷看各类wc女厕嘘嘘偷窃| 狠狠色丁香久久婷婷综合_中| 午夜在线精品偷拍| 亚洲免费网址| 国产午夜精品一区二区三区视频 | 亚洲国产导航| 欧美波霸影院| 一区二区三区欧美| 一本色道久久综合| 国产麻豆视频精品| 久久夜色精品国产噜噜av| 午夜精品剧场| 激情丁香综合| 亚洲黄一区二区三区| 欧美激情一二区| 亚洲天堂网站在线观看视频| 亚洲一区二区三| 狠狠色2019综合网| 亚洲国产女人aaa毛片在线| 欧美精品一区二区三区蜜臀| 一区二区三区国产盗摄| 亚洲欧美日韩精品综合在线观看| 国产午夜亚洲精品理论片色戒| 久久免费偷拍视频| 欧美激情欧美狂野欧美精品| 亚洲午夜精品国产| 久久疯狂做爰流白浆xx| 最新精品在线| 亚洲天堂成人在线观看| 黄色成人在线观看| 亚洲毛片在线| 狠狠入ady亚洲精品| 亚洲三级色网| 狠狠爱www人成狠狠爱综合网| 亚洲欧洲综合| 国内精品久久久| 亚洲美女福利视频网站| 国产在线观看精品一区二区三区| 亚洲激情二区| 国外成人网址| 狠狠综合久久av一区二区老牛| 国产精品久久福利| 国产欧美精品xxxx另类| 免费成人高清在线视频| 欧美日韩亚洲91| 久久理论片午夜琪琪电影网| 欧美激情第4页| 久久夜色精品国产亚洲aⅴ| 国产精品成人一区二区三区吃奶| 欧美成人国产一区二区| 国产精品亚洲激情| 亚洲人精品午夜在线观看| 国内精品久久久久国产盗摄免费观看完整版 | 红桃视频成人| 亚洲综合视频网| 夜夜嗨av一区二区三区网站四季av | 亚洲精美视频| 国产综合久久久久久| 99视频一区二区| 亚洲日本成人| 久久精品国产精品亚洲| 亚洲欧美中文日韩在线| 欧美日韩理论| 亚洲精品网站在线播放gif| 亚洲第一在线视频| 久久精品亚洲一区二区| 久久精品亚洲| 国产免费一区二区三区香蕉精| 一区二区三区www| 亚洲图片欧美日产| 国产精品激情电影| 亚洲一区在线免费| 欧美一级淫片aaaaaaa视频| 欧美日韩国产麻豆| 一本久久知道综合久久| 在线视频亚洲欧美| 欧美日韩亚洲高清一区二区| 亚洲欧洲久久| 亚洲视频在线看| 国产精品久久久久秋霞鲁丝| 99re6热在线精品视频播放速度| 夜夜嗨av一区二区三区| 欧美日韩亚洲国产一区| 亚洲视频在线一区| 久久av一区二区三区| 国产综合久久| 牛牛精品成人免费视频| 亚洲精品国产无天堂网2021| av成人免费| 国产精品视频免费一区| 欧美在线啊v一区| 欧美1区视频| 在线一区日本视频| 国产日本欧美一区二区三区| 久久国产日韩| 91久久精品一区二区别| 久热re这里精品视频在线6| 久久国产视频网站| 国产精品女主播在线观看| 欧美一区综合| 欧美激情按摩在线| 亚洲午夜国产一区99re久久| 国产欧美日韩三区| 久久一区二区三区国产精品| 亚洲精品影视| 久久婷婷av| 在线视频精品一| 在线 亚洲欧美在线综合一区| 欧美日本一道本在线视频| 亚洲欧美另类中文字幕| 亚洲国产va精品久久久不卡综合| 亚洲欧美成人精品| 亚洲第一色在线| 国产精品视频成人| 欧美成人精品高清在线播放| 亚洲一区二区综合| 亚洲国产综合视频在线观看| 欧美在线视频一区二区三区| 亚洲精品孕妇| 国产综合18久久久久久| 欧美三级视频在线| 美女黄色成人网| 欧美一区二区三区婷婷月色 | 欧美与黑人午夜性猛交久久久| 亚洲国产二区| 国产一区视频在线观看免费| 久久精品人人做人人爽电影蜜月| 亚洲精品国精品久久99热| 久久婷婷国产综合尤物精品| 亚洲在线不卡| 9色porny自拍视频一区二区| 黄色成人在线免费| 国产亚洲激情视频在线| 国产精品v欧美精品∨日韩| 欧美激情精品久久久久久变态| 久久精品一区二区国产|