首页 > 其他分享 >OSG 使用整理(5):模板测试与边缘效果

OSG 使用整理(5):模板测试与边缘效果

时间:2023-07-08 12:55:05浏览次数:38  
标签:缓冲 模板 测试 深度 GL osg OSG

osg 使用整理 (5):模板测试与边缘效果

1 模板测试

​ 在渲染管线中,模板测试在片段着色器后执行,通过像素与模板缓冲中的模板值比较,选择性丢弃或者保存这个像素颜色。我们可以通过更新模板测试来获得一些很有意思的效果。下图为LearnOpenGL网站一个例子。

​ 可以发现,颜色缓冲经过模板测试后,只保留了模板值为1的像素颜色。

​ 使用模板缓冲通常的流程:

a 开启模板测试

  glEnable(GL_STENCIL_TEST);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

b 设置模板测试函数,决定如何使用模板缓冲丢弃片段

  glStencilMask(0xFF); // 每一位写入模板缓冲时都保持原样
  glStencilMask(0x00); // 每一位在写入模板缓冲时都会变成0(禁用写入)
  
  /* brief:模板缓冲测试函数
     para[in]: func   测试规则
     para[in]: ref    模板测试参考值
     para[in]: mask   掩码
  */
  glStencilFunc(GLenum func, GLint ref, GLuint mask)
函数 描述
GL_ALWAYS 永远通过深度测试
GL_NEVER 永远不通过深度测试
GL_LESS 在片段深度值小于缓冲的深度值时通过测试
GL_EQUAL 在片段深度值等于缓冲区的深度值时通过测试
GL_LEQUAL 在片段深度值小于等于缓冲区的深度值时通过测试
GL_GREATER 在片段深度值大于缓冲区的深度值时通过测试
GL_NOTEQUAL 在片段深度值不等于缓冲区的深度值时通过测试
GL_GEQUAL 在片段深度值大于等于缓冲区的深度值时通过测试


c 渲染模型,更新模板缓冲,更新函数为

  /* brief:模板缓冲更新函数
     para[in]: sfail  模板测试失败时采取的行为
     para[in]: dpfail 模板测试通过,但深度测试失败时采取的行为
     para[in]: sfail  模板测试和深度测试都通过时采取的行为
  */
  glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)
 
行为 描述
GL_KEEP 保持当前储存的模板值
GL_ZERO 将模板值设置为0
GL_REPLACE 将模板值设置为glStencilFunc函数设置的ref
GL_INCR 如果模板值小于最大值则将模板值加1
GL_INCR_WRAP 与GL_INCR一样,但如果模板值超过了最大值则归零
GL_DECR 如果模板值大于最小值则将模板值减1
GL_DECR_WRAP 与GL_DECR一样,但如果模板值小于0则将其设置为最大值
GL_INVERT 按位翻转当前的模板缓冲值

2 osg::Effect 后处理效果类

​ osg::Effect类如作者所述,用于实现特殊的渲染效果,其派生包括散射光,亮光,卡通等。它是一系列属性状态stateset的集合,允许采用多个osg::technique封装渲染状态,不同technique可以使用不同的渲染上下文。在使用时,只需要创建所需effect实例,然后添加到场景树中,最后把这个effect要影响的模型节点挂载到effect节点上。要创建自定义渲染效果类,可以继承osg::Effect类,然后重写 define_techniques方法,其中可以使用自定义的technique类,添加technique的顺序十分关键。
​ 勾勒对象的轮廓是用于在游戏,多媒体与工业应用表示特殊效果的实践技术。OpenGL的一个实现是在stencil buffer中写入固定值,然后使用细边线渲染对象。在两遍渲染过程之后,对像周围的轮廓就会显示出来。幸运的是,该效果已经由osgFX库中的osgFX::Effect的派生类osgFX::Outline类实现了。下面是使用示例。

#include <osg/Group>
#include <osgDB/ReadFile>
#include <osgFX/Outline>
#include <osgViewer/Viewer>
void main()
{

    osg::ref_ptr<osg::Node> model = osgDB::readNodeFile( "cessna.osg" );

    osg::ref_ptr<osgFX::Outline> outline = new osgFX::Outline;
    outline->setWidth( 8 );
    outline->setColor( osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f) );
    outline->addChild( model.get() );
    
    osg::DisplaySettings::instance()->setMinimumNumStencilBits( 1 );
    
    osgViewer::Viewer viewer;
    viewer.getCamera()->setClearMask(
        GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    viewer.setSceneData( outline.get() );
    return viewer.run();
}

标签:缓冲,模板,测试,深度,GL,osg,OSG
From: https://www.cnblogs.com/wangxydela/p/17537048.html

相关文章

  • 15款最佳的HTML5移动模板
    如果你需要响应式和前端开发,那么HTML5是你务必要学会的Web开发语言。我们在Codecondo上发布的HTML5相关文章依然很受欢迎。例如:为HTML5开发者准备的40个工具、针对HTML5的Web框架,你一定要看看它们,我也相信它们会成为你书签的其中之一。当人们上网搜索登陆页面的时候,他们大多是寻......
  • P3378 【模板】二叉堆
    [洛谷]P3378【模板】堆方法一手写堆最小堆插入从新增的最后一个结点的父结点开始,用要插入元素向下过滤上层结点(相当于要插入的元素向上渗透)voidsiftdown(inti)//传入一个需要向下调整的结点编号i,这里传入1,即从堆的顶点开始向下调整{intt,flag=0;//flag用来标......
  • 洛谷题解——【模板】堆
    题目链接:【模板】堆【模板】堆题目描述给定一个数列,初始为空,请支持下面三种操作:给定一个整数\(x\),请将\(x\)加入到数列中。输出数列中最小的数。删除数列中最小的数(如果有多个数最小,只删除\(1\)个)。输入格式第一行是一个整数,表示操作的次数\(n\)。接下来\(n\)......
  • windows配置RocketMQ并测试发送消息
    https://github.com/alibaba/spring-cloud-alibaba/wiki/RocketMQ下载rocketmq-all-4.9.5-bin-release 必须配置一个RocketMQ路径的环境变量(参考博客的第二个) 配置内容如下,目录在bin的上层   解压,进入解压目录conf,修改broker.conf在该文件中加入两行(建议直接复......
  • 20230706巴蜀暑期集训测试总结
    T1我是个大聪明!一眼矩乘。构造转移矩阵构造了3.5h!最开始以为只有\(15\times15\),直接手打。写到一半发现不一定四种颜色都有,是\(52\times52\)的,这时候狗被脑子吃了,还想手打,于是就打到了3h。差不多打了一大半,脑子终于把狗还回来了,意识到就算打完也不可能调得出来,就开始另辟蹊径,......
  • 20230707巴蜀暑期集训测试总结
    T1SPFA就能过!给我震惊到了。可以斜率优化。对每个站点维护一个凸包。\[f(x)=Ax^2+Bx+C\\dp_{v,q}=\min_{i=0}^{p}\{dp_{u,i}+f(p-i)\}\\(i,dp_{x,i}+Ai^2-Bi)\]T2考场想了想区间dp,有点思路但是时间不多了有点慌,打个暴搜直接跑。相当于将位置当作第二关键字比较,最大的数......
  • 性能测试工具loadrunner学习
    一、性能测试基础1.性能测试概述  性能测试分类 性能测试方式时通过模拟生产运行的业务压力量和使用场景组合,测试系统的性能是否满足生产性能要求,通俗地讲,这种方法就是要在特定的运行条件下验证系统的能力状况。 ......
  • C++ 设计模式之模板方法模式
    设计模式之模板方法模式模板方法模式,定义一个操作中的算法的股价,而将一些步骤延迟到了子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。说白了就是有一个算法有很多部分,这个算法在基类中已经定义好了。而算法中的各个部分都写成各个成员函......
  • JAVA设计模式之模板模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、......
  • 测试中台业务架构
       ......