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

逛奔的蝸牛

我不聰明,但我會很努力

   ::  :: 新隨筆 ::  ::  :: 管理 ::
每個像素都有自己對應的 Buffer,其實就是一個 32bit 的數,如 Color Buffer, Depth Buffer, Stencil Buffer. Stencil Buffer 與 Depth Buffer 有點特別,因為他們共用同一個 Buffer, Depth Buffer 占用 Buffer 前面的 24Bit, Stencil Buffer 占用后面的 8Bit. Stencil Buffer 可以使用從 1Bit-8Bit. 如在繪制反射時,就像照鏡子一樣,因為只需要在反射平面上繪制物體的鏡像,即要么在反射平面上繪制,要不就不繪制,所以只需要用到 1Bit 的 Stencil Buffer.
 
什么叫 Stencil Buffer ?
即是一個模板,也就是說,他可以是一個平面,也可以是一個立體幾何圖形,如一個四邊形,一個Teapot. 在模板所占據的空間中,他的值為 1(values stored in the stencil buffer), 在啟用 Stencil Buffer 時,我們所畫的圖形只有在這個空間中的部分才能顯示出來,所以我們可以創建一個模板,他是一個字,然后以后畫的圖形最多只能把這個字給顯示出來,這個圖形有其他部分都沒有被寫進 Color Buffer.
 
Stencil Buffer 最簡單的運用,用來生成鏡面反射。
1. 先要使編程環境支持 Stencil Buffer
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_STENCIL);
 
2. 設置清除 Stencil Buffer 使用的函數
        glClearStencil(0);
 
3. 在我們創建模板的時候,要先關掉 Depth Test und Color Mask,
        因為我們并不想把模板畫到屏幕上
        glDisable(GL_DEPTH_TEST);
        glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
        // 為了把我們的模板圖形不顯示到屏幕上,但又要寫入 Stencil Buffer 中。
 
        我們什么時候創建模板的?就是在啟用模板緩存后進行的第一次進繪制的圖形就是模板。
        OpenGL會根據我們所設定的 glStencilFunc 的值和 glStencilOp 來比較,
        然后在 plane 中(即視口所對應的那個二維數組)寫入比較的結果值。
 
4. 開始創建模板
        glEnable(GL_STENCIL_TEST);
        glStencilFunc(GL_ALWAYS, 0x1, 0x1);
        // 把模板圖形所在的區域的 Buffer 值設置成 1, 其余的還是 0.
        // 這時用的就是給 glStencilFunc 指定的 ref 的值,現在是 1
        // 當然可以有其他的操作,如 GL_INCR, GL_INVERT(bitwise invert)
        glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
       
        // 開始創建模板的圖形
        drawFloor();
       
        // 模板創建好后,我們就要設置下一次進行繪制時的模板函數
        // 只有通過條件的像素才能被顯示到屏幕上,否則就被丟棄
        // 但要注意,現在我們要進行繪制的就是鏡像了,所以是要被顯示到屏幕上的,
        // 所以在繪制之前,要把顏色屏蔽關掉和啟用深度測試
        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
        glEnable(GL_DEPTH_TEST);
 
        // Stencil buffer 值等于 1 的地方才繪制到屏幕上       
        glStencilFunc(GL_EQUAL, 0x1, 0x1);
        glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
 
5. 繪制鏡像圖像
        // 現在繪制我們的鏡像圖像
        // 鏡像是跟原來的物體對稱的, 所以用 glScalef 來進行反轉,實現對稱
        // 在繪制鏡像物體的時候,燈光也要相應的反轉
        glPushMatrix();
                glScalef(1, -1, 1);
                glutSolidTeapot(1.0f);
        glPopMatrix();
 
6. 在模板中顯示的鏡像圖像已經創建好,不再需要模板了,所以我們關掉 stencil buffer
        glDisable(GL_STENCIL_TEST);
 
7. 繪制鏡像所在的平面,就如鏡子
        // 使用 Blend 與鏡像圖像混合起來
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        drawFloor();
        glDisable(GL_BLEND);
 
8. 繪制產生鏡像的物體
        glutSolidTeapot(1.0f);
 
至此,真正的鏡面反射已經創建完成。
非真正的反射可以如下實現:
先畫對稱物體,畫出鏡面(使用 Blend), 然后畫出原物體,但這時如果旋轉Camera,就會發現,那個對稱的物體并不是平面的,還是原來的空間立體物體。但用 Stencil Buffer 實現的鏡面反射是真正的鏡面反射,鏡像是只在鏡面上顯示,即是平面的。
 
下面的代碼可以很好的工作
 //****************************************************************//
 if (useStencil) {
          glClearStencil(0);
          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 } else {
          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 }

 if (useStencil) {
          glDisable(GL_DEPTH_TEST);
          glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
          /* Draw 1 into the stencil buffer. */
          glEnable(GL_STENCIL_TEST);
          glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
          glStencilFunc(GL_ALWAYS, 1, 0xffffffff);
          /* Now render floor; floor pixels just get their stencil set to 1. */
          drawFloor();
          /* Re-enable update of color and depth. */
          glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
          glEnable(GL_DEPTH_TEST);
          /* Now, only render where stencil is set to 1. */
          glStencilFunc(GL_EQUAL, 1, 0xffffffff); /* draw if ==1 */
          glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
 }
 glPushMatrix();
          glScalef(1, -1, 1);
          glTranslatef(0.0, 0.8, 0);
          glColor3f(0, 1, 0);
          glutSolidTeapot(1);
 glPopMatrix();
 
 if (useStencil) {
          glDisable(GL_STENCIL_TEST);
 }
 glEnable(GL_BLEND);
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 glColor4f(0.7, 0.0, 0.0, 0.3);
 drawFloor();
 glDisable(GL_BLEND);
 
 glTranslatef(0, -0.0001, 0);
 glFrontFace(GL_CW);
 glColor3f(1, 1, 1);
 drawFloor();
 
 glTranslatef(0.0, 0.8, 0);
 glColor3f(0, 1, 0);
 glutSolidTeapot(1);
 //****************************************************************//
 
posted on 2010-12-17 17:39 逛奔的蝸牛 閱讀(2884) 評論(4)  編輯 收藏 引用 所屬分類: OpenGL

評論

# re: OpenG:Reflection-Stencil Buffer[未登錄] 2013-09-16 16:15 james
博主,你這個字體顏色著實讓人開的眼睛很疼。  回復  更多評論
  

# re: OpenG:Reflection-Stencil Buffer 2014-05-01 10:32 tutu
博主,你這個字體顏色著實讓人看的眼睛很疼。  回復  更多評論
  

# re: OpenG:Reflection-Stencil Buffer 2015-09-10 10:05 f
博主,你這個字體顏色著實讓人看的眼睛很疼。  回復  更多評論
  

# re: OpenG:Reflection-Stencil Buffer 2016-04-20 21:15 一顆賽艇
那若是反射面不是y=0平面,而是任意ax+by+cz=d咋辦?謝謝。  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品第三页| 亚洲男女自偷自拍| 午夜欧美电影在线观看| 久久精品国产69国产精品亚洲| 日韩网站在线看片你懂的| 亚洲三级视频| 最新国产の精品合集bt伙计| 亚洲裸体视频| 在线视频你懂得一区| 欧美一级淫片aaaaaaa视频| 欧美一区亚洲| 欧美电影免费观看| 国产九区一区在线| 亚洲国产精品美女| 亚洲精品资源| 欧美在线免费观看亚洲| 亚洲第一网站| 亚洲一区二区在线观看视频| 老司机aⅴ在线精品导航| 欧美日韩视频在线一区二区| 国产乱码精品1区2区3区| 伊人婷婷久久| 中文高清一区| 欧美成人综合| 欧美一区二区三区精品电影| 欧美成人一二三| 国产视频欧美视频| 一区二区三区高清不卡| 久久性天堂网| 亚洲日本中文| 久久理论片午夜琪琪电影网| 欧美理论在线| 精品电影在线观看| 久久国产一区| 亚洲影视综合| 国产精品99免费看| 亚洲精品久久久久久久久久久久久| 欧美在线啊v| 亚洲一区观看| 欧美日韩精品一区| 亚洲国内精品在线| 麻豆国产精品777777在线| 亚洲欧美在线aaa| 国产精品a久久久久| 一区二区三区鲁丝不卡| 亚洲大片av| 乱人伦精品视频在线观看| 国产一区二区三区四区hd| 性久久久久久久久久久久| 一本色道婷婷久久欧美| 欧美激情第4页| 亚洲人成7777| 亚洲国产精品第一区二区三区| 久久婷婷av| 亚洲国产日韩欧美综合久久| 媚黑女一区二区| 久久亚洲一区| 亚洲黄色三级| 91久久精品国产91久久性色| 欧美成人中文| 一区二区三区四区国产| 亚洲精选久久| 中文一区二区在线观看| 欧美日韩在线电影| 亚洲婷婷综合久久一本伊一区| 91久久国产自产拍夜夜嗨| 老司机精品福利视频| 亚洲国产精品成人综合| 欧美激情精品久久久久| 欧美国产国产综合| 亚洲精品一区二区三区99| 亚洲欧洲精品一区二区三区 | 国产精品主播| 亚洲欧美成人综合| 亚洲欧美韩国| 伊人成人在线视频| 亚洲第一成人在线| 国产精品高精视频免费| 香蕉久久久久久久av网站| 亚洲在线播放电影| 国产一区二区精品久久91| 欧美高清在线| 国产精品久久久久久久久免费| 欧美一区二区大片| 久久一区亚洲| 亚洲一区久久久| 午夜日韩视频| 夜夜嗨av一区二区三区| 午夜视频一区在线观看| 亚洲精品字幕| 性一交一乱一区二区洋洋av| 亚洲人精品午夜在线观看| 亚洲一区在线观看免费观看电影高清| 伊人久久综合97精品| 依依成人综合视频| 日韩视频中文| 在线不卡中文字幕| 一区二区三区鲁丝不卡| 国产亚洲网站| 亚洲精品一区二区三区在线观看| 国产偷久久久精品专区| 亚洲欧洲日本mm| 国产丝袜一区二区三区| 亚洲人成人一区二区在线观看| 国产情人节一区| 亚洲人成小说网站色在线| 红桃av永久久久| 在线一区免费观看| 最新精品在线| 欧美资源在线观看| 亚洲女ⅴideoshd黑人| 欧美不卡福利| 羞羞答答国产精品www一本| 欧美福利一区二区| 免费在线成人| 国内成+人亚洲| 午夜精品区一区二区三| 亚洲一区二区伦理| 欧美激情影音先锋| 男人的天堂亚洲| 国产视频在线观看一区二区| 亚洲视频1区| 99精品免费网| 麻豆视频一区二区| 国产专区欧美精品| 一区二区免费在线播放| 久久人人97超碰国产公开结果 | 噜噜爱69成人精品| 国产精品乱人伦中文| 日韩视频精品| 一区二区三区回区在观看免费视频| 欧美α欧美αv大片| 亚洲黄色一区二区三区| 亚洲黄色免费| 麻豆成人91精品二区三区| 久久网站免费| 国产主播喷水一区二区| 久久国产乱子精品免费女 | 欧美激情国产日韩| 欧美成人69| 日韩亚洲视频在线| 欧美国产日韩在线| 亚洲日本va午夜在线电影| 一区二区动漫| 国产精品xvideos88| 亚洲一区不卡| 久久国产精品高清| 国产一区二区三区四区三区四| 亚洲欧美国产日韩中文字幕| 欧美视频一区二区| 亚洲综合另类| 久久全球大尺度高清视频| 亚洲高清视频在线| 欧美日韩妖精视频| 性欧美办公室18xxxxhd| 欧美成人免费一级人片100| 99在线热播精品免费99热| 欧美亚州一区二区三区| 欧美一区二区三区在线看| 蜜臀av在线播放一区二区三区| 永久久久久久| 欧美日韩亚洲免费| 欧美在线观看视频在线| 久热精品在线| 一区二区三区免费网站| 国产综合色产| 欧美日韩精品一区视频| 性伦欧美刺激片在线观看| 亚洲国产精品成人精品| 亚洲免费视频中文字幕| 伊人久久综合97精品| 欧美日韩一区综合| 久久精品国产一区二区电影| 欧美国产视频日韩| 亚洲一区久久久| 亚洲黄一区二区三区| 欧美午夜精品久久久久免费视| 欧美中文在线观看| 99v久久综合狠狠综合久久| 性8sex亚洲区入口| 亚洲六月丁香色婷婷综合久久| 国产精品久久久久av免费| 美女精品在线| 亚洲男女毛片无遮挡| 亚洲激情电影中文字幕| 久久全球大尺度高清视频| 亚洲视频欧美在线| 欧美激情1区2区3区| 国产精品久久久久久亚洲调教| 亚洲视频香蕉人妖| 尤物九九久久国产精品的特点| 欧美福利视频一区| 欧美一级免费视频| 一本色道精品久久一区二区三区| 亚洲视频导航| 最新中文字幕一区二区三区| 国产精品视频999| 欧美人成在线视频| 久久亚洲欧美国产精品乐播| 欧美综合二区|