cocos2D-X源碼分析之從cocos2D-X學習OpenGL(13)----模板測試

     像素着色器調用完成後。模板測試就開始了,它可以丟棄片元,模板緩衝在渲染時獲得有意思的效果。

     模板緩衝中一個模板值有8位大小,每個窗口都會創建一個默認的模板緩衝,它可以通過數據控制屏幕顯示,從而形成了顯示裁剪的效果,如圖所示。


glEnable(GL_STENCIL_TEST);
       首先需要調用上面函數開啓模板測試,然後進行模板測試的操作

       我們曾經介紹過cocos2d-x的裁剪節點(文章地址:http://blog.csdn.net/bill_man/article/details/8498424),這種節點在2d遊戲中經常應用,比如卡牌遊戲的卡牌展示等等,這個類就是用模板測試完成的,我們後續會介紹關於模板測試的函數

glStencilMask(mask_layer);
        glStencilMask函數允許我們給模板值設置一個位遮罩,它與模板值進行And操作決定緩衝是否可寫。

glStencilFunc(GL_NEVER, mask_layer, mask_layer);
         模板方程決定何時模板測試通過或失敗,它有三個參數,第一個參數是選擇關係符號,可用的參數有:

       它和深度緩衝的方程用的值類似(深度緩衝會在後面介紹);第二個參數是指定模板測試的引用值。模板緩衝的內容會與這個值對比,第三個參數是指定一個遮罩,在模板測試對比引用值和儲存的模板值前,對他們進行And參數,初始設置爲一,glStencilFunc描述了openGL對模板緩衝做什麼,我們需要另外一個函數gllStencilOp函數告訴我們如何更新緩衝

glStencilOp(!_inverted ? GL_ZERO : GL_REPLACE, GL_KEEP, GL_KEEP);
       第一個參數設置如果模板測試失敗將採取的動作,第二個參數設置如果模板測試用過,但是深度測試失敗時採取的動作,第三個參數是如果模板測試和深度測試都通過將採取的動作,每個選項可以使用如下的動作:


      使用glStencilFunc和gllStencilOp,就可以指定在什麼時候以及如何更新模板緩衝,並且指定何時讓模板測試通過或不通過

      通過模板測試,我們可以實現圖片裁剪效果,需要注意的是在一個裁剪節點上不能再用另外一個裁剪節點,否則會產生錯誤的效果。

      

      能力不足,水平有限,如有錯誤,歡迎指出。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章