OpenGL 模板测试 对图像进行剪裁

读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);// 第二个三角形

未开启模板测试的显示状态:

    未开启模板测试的显示状态

开启模板测试的状态:

开启模板测试的状态.png

第一个三角形反向裁剪:

第一个三角形反向裁剪

模板的绘制_没设置ColorMask的情况:

模板的绘制_没设置ColorMask的情况

猜你喜欢

转载自my.oschina.net/u/235558/blog/1816401