OpenGL ES 學習教程(十三) Stencil_TEST(模板緩衝測試)
模板緩衝測試,是指 將模版緩衝區中的值 與 一個參考值 進行比較,根據比較的結果,來對緩衝區中的值進行修改。進而決定該片段是否有效。
在應用中的體現就比如:Unity中的Mask 。
大致的工作流程:
1、第一次Draw的時候,將所有的片段都設定為不通過模版測試。然後修改模版緩衝區的值,比如+1.
2、第二次Draw的時候,給定一個值 與 模版緩衝區中的值進行比較,比如用 1 與模版緩衝區中的值進行比較 。 因為第一步中,已經+1,所以模版緩衝區中值已經是1,然後用相等 作為條件判定 模版測試通過。那麼這個片段就可以繪製。
3、這樣做的最終效果是,只有第一次繪製的區域,第二次繪製才可以顯示。就如同Unity中的Mask,用一張圖,Mask掉第二張圖。
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
在不使用模版測試的情況下,畫了兩個三角形。
首先 就如同深度測試一樣,也要申請模版緩衝區。
bool initDevice() { const EGLint attribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_ALPHA_SIZE,8, EGL_DEPTH_SIZE, 24, //請求深度緩衝區 EGL_STENCIL_SIZE, 8,//請求模版緩衝區 EGL_NONE }; EGLint format(0); EGLint numConfigs(0); EGLint major; EGLint minor; //! 1 m_EGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); ...... }
然後要開啟模版測試
//重寫初始化函式;
virtual void onInit()
{
Light3dWinAPP::onInit();
m_program.Initialize();
glEnable(GL_STENCIL_TEST);//開啟模版測試
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS); //基準設定為 1.0,那麼GL_LESS 則深度小余 1.0 的通過測試
}
然後要設定預設模版值
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn//重寫Render; virtual void render() { glClearColor(0, 0, 0, 1.0); glClearDepthf(1.0f);//深度測試的基準,注意1.0代表從近裁剪面到遠裁剪面 這一段範圍!!並不是指Z軸的1個單位 glClearStencil(0); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT |GL_STENCIL_BUFFER_BIT);
然後在第一次繪製的時候,指定所有的都不通過模版測試,並且模版值 +1 。
m_program.begin();
{
glStencilFunc(GL_NEVER, 0x0, 0xFF);//第一次繪製,通通不通過模版測試。
glStencilOp(GL_INCR, GL_INCR, GL_INCR);//第一次繪製的畫素的模版值 0+1 = 1
然後在第二次繪製的時候,比較深度緩衝區中的值,值為 1 的通過測試。
{
glStencilFunc(GL_EQUAL, 0x1, 0xFF);//等於1 通過測試 ,就是上次繪製的圖 的範圍 才通過測試。
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);//沒有通過測試的,保留原來的,也就是保留上一次的值。
glm::vec4 pos[] =
{
glm::vec4(0.0f, -2.0f, 1.5f, 1.0f),
glm::vec4(4.0f, -2.0f, 1.5f, 1.0f),
glm::vec4(2.0f, 2.0f, 1.5f, 1.0f),
};
glm::vec4 color[] =
{
glm::vec4(1, 1, 0, 1),
glm::vec4(1, 1, 0, 1),
glm::vec4(1, 1, 0, 1),
};
glUniformMatrix4fv(m_program.m_mvp, 1, false, &proj[0][0]);
glVertexAttribPointer(m_program.m_position, 4, GL_FLOAT, false, sizeof(glm::vec4), pos);
glVertexAttribPointer(m_program.m_color, 4, GL_FLOAT, false, sizeof(glm::vec4), color);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
這樣我們得到的效果就是Mask的效果,只有第一次繪製的範圍裡,才能顯示第二次繪製。
如果將比較修改為 不等於 1 的通過測試,那麼效果就是第一次繪製的區域被抹除掉。
{
glStencilFunc(GL_EQUAL, 0x1, 0xFF);//等於1 通過測試 ,就是上次繪製的圖 的範圍 才通過測試。
glStencilFunc(GL_NOTEQUAL, 0x1, 0xFF);//不等於1 通過測試 就是除了上次繪製的圖案之外的畫素通過測試,所以上次繪製的畫素之外的畫素才可以進行第二幅圖的繪製。
//glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);//沒有通過測試的,保留原來的,也就是保留上一次的值。
glm::vec4 pos[] =
{
glm::vec4(0.0f, -2.0f, 1.5f, 1.0f),
glm::vec4(4.0f, -2.0f, 1.5f, 1.0f),
glm::vec4(2.0f, 2.0f, 1.5f, 1.0f),
};
glm::vec4 color[] =
{
glm::vec4(1, 1, 0, 1),
glm::vec4(1, 1, 0, 1),
glm::vec4(1, 1, 0, 1),
};
glUniformMatrix4fv(m_program.m_mvp, 1, false, &proj[0][0]);
glVertexAttribPointer(m_program.m_position, 4, GL_FLOAT, false, sizeof(glm::vec4), pos);
glVertexAttribPointer(m_program.m_color, 4, GL_FLOAT, false, sizeof(glm::vec4), color);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn示例專案下載:
連結: http://pan.baidu.com/s/1mhMlVAg 密碼: 77cg
相關推薦
OpenGL ES 學習教程(十三) Stencil_TEST(模板緩衝測試)
模板緩衝測試,是指 將模版緩衝區中的值 與 一個參考值 進行比較,根據比較的結果,來對緩衝區中的值進行修改。進而決定該片段是否有效。在應用中的體現就比如:Unity中的Mask 。大致的工作流程:1、第一次Draw的時候,將所有的片段都設定為不通過模版測試。然後修改模版緩衝區
iOS開發-OpenGL ES入門教程1
貼圖 iba 細節 con osi tutorial name rip tex http://www.jianshu.com/p/750fde1d8b6a 這裏是一篇新手教程,環境是Xcode7+OpenGL ES 2.0,目標寫一個OpenGL ES的hello wor
[原] OpenGL ES 學習筆記 (一)
信號 ppi sci DC RM 視錐 技術分享 img 比較 1. OpenGL ES 的坐標系在屏幕上的分布 OpenGL ES 的坐標系{x, y, z} 通過圖片的三維坐標系可以知道: - 它是一個三維坐標系 {x,
03: OpenGL ES 基礎教程02 使用OpenGL ES 基本步驟
war 點數據 緩存 ttr inf demo eve point 指南 第二章:讓硬件為你工作(OpenGL ES 應用實踐指南 iOS卷) 前言: 1:使用OpenGL ES 基本步驟 2:繪制三角形 3:效果 正文: 一:使用OpenGL ES
Android OpenGL ES 開發教程 22 繪製一個球體
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Android OpenGL ES 開發教程 5 關於EGL
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
OpenGL系列學習教程(零)---第一個視窗
【寫在前面】 首先,要說明的是:這個系列將使用glfw+glad作為基本的視窗系統和opengl擴充套件,編譯器則為 VS2013。 其次,本篇從獲取、編譯、連結glfw+glad庫講起,然後建立glfw環境,並保證它能夠正確地建立OpenGL上下文並顯示視窗,所以已經搭
Android OpenGL ES 開發教程 26 設定光照效果Set Lighting
上一篇簡單介紹了OpenGL中使用的光照模型,本篇結合OpenGL ES API說明如何使用光照效果:設定光源定義法線設定物體材料光學屬性光源OpenGL ES中可以最多同時使用八個光源,分別使用0到7表示。OpenGL ES光源可以分為平行光源(Parallel light
OpenGL ES學習初體驗
緒論 OpenGL定義:OpenGL(全寫Open Graphics Library)是個定義了一個跨程式語言、跨平臺的程式設計介面的規格,它用於三維影象。OpenGL是個專業的圖形程式介面,是一個功能強大,呼叫方便的底層圖形庫。 OpenGL ES(Ope
OpenGL ES基礎教程
一、設定OpenGL ES檢視 設定OpenGL檢視並不難,Android上也較簡單。我們一般只需要2個步驟。 GLSurfaceView 我們要為GLSurfaceView提供一個專門用於渲染的介面 public void setRenderer(GLSurface
OpenGL入門學習(十三) 【轉】
前一段時間裡,論壇有位朋友問什麼是狀態機。按我的理解,狀態機就是一種存在於理論中的機器,它具有以下的特點:1. 它有記憶的能力,能夠記住自己當前的狀態。2. 它可以接收輸入,根據輸入的內容和自己的狀態,修改自己的狀態,並且可以得到輸出。3. 當它進入某個特殊的狀態(停機狀態
opengl es學習筆記一
首先明白opengl和opengl es的關係,我想opengl的接受網站上到處都是了,這裡就不囉嗦了,我的理解就是opengl es是opengl的子集,是針對嵌入式裝置而設計的API! 我的這些部落格是學習openglES Game Development的筆記,所以
Android OpenGL ES 開發教程(1):導言
Android ApiDemos到目前為止,介紹完了出View以外的所有例子,在介紹Graphics示例時跳過了和OpenGL ES 相關的例子,OpenGL ES 3D圖形開發需要專門的開發教程,因此從今天開始一邊繼續Android ApiDemos Views例子的解析
Android OpenGL ES學習筆記之新增顏色
一、分類 新增顏色的種類有兩種 - Flat coloring 單色 - Smooth coloring 平滑著色 單色 顧命思義就是一種單一的顏色,呼叫 glColor4f(float red,
Android OpenGL ES學習筆記之常用API
上一篇文章Android OpenGL ES學習筆記之繪製點涉及到了一些API,在這篇文章配合一些例項給大家詳細的講解下,會持續更新。 我這裡有OpenGl ES 的API中文文件,不過不全,可以配合著看 開啟連結 密碼:gjlz 一、緩衝區 在O
ES學習記錄11——搜尋模板(Search Template)
1. 搜尋模板 /_search/template端點允許使用mustache language(繼承ES沙箱指令碼語言的一種語言,是護胡言亂語嗎……)為每個呈現搜尋請求,在執行前和用模板引數填充現有的模板: curl -X GET "localhost:92
Android OpenGL ES 開發教程(8):基本幾何圖形定義
通常二維圖形庫可以繪製點,線,多邊形,圓弧,路徑等等。OpenGL ES 支援繪製的基本幾何圖形分為三類:點,線段,三角形。也就是說OpenGL ES 只能繪製這三種基本幾何圖形。任何複雜的2D或是3D圖形都是通過這三種幾何圖形構造而成的。 比如下圖複雜的3D圖形,都有
OpenGL系列學習教程(零)---在Qt/Quick中使用OpenGL
【寫在前面】 首先,想要說明的是,本系列學習教程是根據我自己學習的經歷而寫,並非完全科普性的,零基礎的教程,而且其水平也很受我本身的水平影響,so 如果有不足之處,還請多多指教~~ 其次,本系列使用 Qt/Quick 來編寫所有的opengl程式,所以和原生的opengl
OpenGL ES 幀緩衝物件(FBO):Render to texture
幀緩衝物件FBO 建立幀緩衝物件 紋理附著 渲染緩衝物件附著 渲染到紋理Render to Texture 渲染到深度紋理
Android OpenGL ES 簡明開發教程一 概述
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!