1. 程式人生 > >OpenGL ES 學習教程(十三) Stencil_TEST(模板緩衝測試)

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 的通過測試
}

然後要設定預設模版值
//重寫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);
	
轉自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

然後在第一次繪製的時候,指定所有的都不通過模版測試,並且模版值 +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 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!