glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP); // 如果模板測驗失敗,用ref替換模板緩沖值
glStencilMask(10); // 設定掩碼為10
glClearStencil(13); // 設定模板緩沖區的默認值
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // 模板緩沖區中的值是10&13 = 8
glStencilMask(0xff); // 設定模板測驗失敗時的寫入掩碼
glStencilFunc(GL_EQUAL, 9, 0xf); // (0xf & 8) != (0xf & 9),則測驗不通過
// 畫第一個三角形
glUseProgram(shaderProgramOrange);
glBindVertexArray(VAOs[0]);
glDrawArrays(GL_TRIANGLES, 0, 3);
glStencilFunc(GL_EQUAL, 9, fmask); // 由于是replace,第一次測驗時應該已經將模板緩沖值改成9了,
// 即此處的測驗應該能通過,但是實測是不通過??????
// 畫第二個三角形
glUseProgram(shaderProgramYellow);
glBindVertexArray(VAOs[1]);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
// Swap the screen buffers
glfwSwapBuffers(window);
glStencilMask(0xff);
glClearStencil(0); // 重新設定模板緩沖值為0
glClear(GL_STENCIL_BUFFER_BIT);
以上代碼,主要的邏輯就是當第一次模板測驗失敗時replace模板緩沖值(8替換為9),然后用新的模板緩沖值(9)進行測驗,理論上第二次測驗應該能通過,也即第二個三角形能繪制出來,但是實際是第二次模板測驗還是失敗的。將18行第二次模板測驗方式改成“glStencilFunc(GL_EQUAL, 8, fmask)”就能測驗通過,也就是說GL_REPLACE在第一次模板測驗失敗時并沒有替換模板緩沖值!請問這是什么原因?
先謝謝了!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277903.html
標籤:Unity3D
