2019独角兽企业重金招聘Python工程师标准>>>
读OpenGL红宝书第九版, 书上的代码不完整, 自己的研究成果. 这段代码是把红宝书的一个例子拷来修改的( 例子代码:https://pan.baidu.com/s/1UjyJzgQlGQn7a0k-vXrYDQ Gouraud这个例子)
原码下载:https://pan.baidu.com/s/180PL7Bay6YbF1TjmuHeZrw
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);// 第二个三角形
未开启模板测试的显示状态:
开启模板测试的状态:
第一个三角形反向裁剪:
模板的绘制_没设置ColorMask的情况: