OpenGL 模板測試 對圖像進行剪裁

讀OpenGL紅寶書第九版, 書上的代碼不完整, 本身的研究成果. 這段代碼是把紅寶書的一個例子拷來修改的( 例子代碼:https://pan.baidu.com/s/1UjyJzgQlGQn7a0k-vXrYDQ    Gouraud這個例子)git

原碼下載:https://pan.baidu.com/s/180PL7Bay6YbF1TjmuHeZrwgithub

1. 聲明清除數據爲0  
    glClearStencil(0x0);// 爲0x0時畫什麼, 爲0x1時畫什麼, 由display程序而定 , 本例是能夠沒有這句, 但必須不爲1
2. 打開模板測試
    glEnable(GL_STENCIL_TEST);// 打開模板測試
    glEnable(GL_DEPTH_TEST);// 深度測試在本例中能夠沒有
3. 繪製模板:
    在Display函數內
    3.1: 設置測試經過,設置透明區域
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);// 繪製時, 爲透明, 否則屏幕上會顯示模板的內容,而不是單單裁剪.
    glDepthMask(GL_FALSE);// 若是以前沒有開啓深度測試, 這句能夠沒用, 而當有深度測試且沒有這句時, 模板所覆蓋的內容會被裁剪掉
    glStencilMask(0xFF);// 容許寫入模板, 否則下一幀是會被清空的
    glStencilFunc(GL_ALWAYS, 1, 0xFF);// 給模板用的話,第二個參數必須是1 , 第三個參數隨意
    3.2: 在模板內畫第三個三角形:
    glDrawArrays(GL_TRIANGLES, NumVertices, NumVertices / 2);
    3.3: 關掉對模板的繪製, 畫將被裁剪的內容
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);// 以前設置的透明, 設置回來
  glDepthMask(GL_TRUE);// 這個是人家的貼子抄的, 本例中沒有透視效果 https://github.com/wangdingqiao/noteForOpenGL/tree/master/stencilTesting
    glStencilMask(0x00); // 禁止寫入stencil  聲明以後寫入的不是模板而是其它內容
4. 繪製那兩個三角形:
    glStencilFunc(GL_EQUAL, 0x1, 0x1);// 相等則繪製 第二個參數,爲0時, 爲反向裁剪
    glDrawArrays(GL_TRIANGLES, 0, NumVertices / 2);// 第一個三角形
    glStencilFunc(GL_NOTEQUAL, 0x1, 0x1);// 不等則繪製 第二個參數,爲0時, 爲反向裁剪
    glDrawArrays(GL_TRIANGLES, NumVerticesOfTriangle, NumVerticesOfTriangle);// 第二個三角形函數

 

未開啓模板測試的顯示狀態:測試

    未開啓模板測試的顯示狀態

開啓模板測試的狀態:ci

開啓模板測試的狀態.png

第一個三角形反向裁剪:get

第一個三角形反向裁剪

模板的繪製_沒設置ColorMask的狀況:it

模板的繪製_沒設置ColorMask的狀況

相關文章
相關標籤/搜索