openGL学习:模板测试里的深度比较

网上搜集了下模板测试的知识,有些都实现了很棒的效果,但大都没有介绍glStencilOp函数里的深度测试情况,这里修改编程宝典里的代码测试下。

先看看OpenGL编程指南里glStencilOp/glStencilOpSeparate函数的介绍:
在这里插入图片描述
下面开始进行测试修改:
1 没有模板测试的效果图:
在这里插入图片描述
2.使用模板测试
代码:

	//绘制正文体
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	glEnable(GL_STENCIL_TEST);
	//模板测试永远不通过
	glStencilFunc(GL_NEVER, 0, 0);
	//模板值加1
	glStencilOp(GL_INCR, GL_KEEP, GL_KEEP);
	cubeBatch.Draw();
	glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
	glDisable(GL_STENCIL_TEST);
	
	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	cubeBatch.Draw();
	
	//绘制地板
	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	glEnable(GL_STENCIL_TEST);
	//模板值等于0时绘制
	glStencilFunc(GL_EQUAL, 0, 0xff);
	shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBrown);
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	floorBatch.Draw();

效果如图:
在这里插入图片描述
简单的修改下模板值为1时绘制地板:

	glStencilFunc(GL_EQUAL, 1, 0xff);

效果如图:
在这里插入图片描述
直接让模板测试通过,进行深度测试会如何呢?

	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	glEnable(GL_STENCIL_TEST);
	//关闭深度测试
	glDisable(GL_DEPTH_TEST);
	glStencilFunc(GL_ALWAYS, 0, 0);
	//模板测试直接通过,关闭深度测试时深度测试通过,第三个参数进行了加1操作
	glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
	cubeBatch.Draw();
	glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
	glDisable(GL_STENCIL_TEST);

	glDisable(GL_CULL_FACE);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	
	// Draw the front side cube
	cubeBatch.Draw();
	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	//模板值等于0时绘制
	glEnable(GL_STENCIL_TEST);
	glStencilFunc(GL_EQUAL, 0, 0xff);
	
	shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBrown);
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	floorBatch.Draw();

效果如下图:可以看出,模板测试直接通过,片元没有被丢弃,实体的正方体显示出来了,和线的立方体重合了。模板为0的地板也画出来了。
在这里插入图片描述
修改下画模板值为1的地方:

	glStencilFunc(GL_EQUAL, 1, 0xff);

在这里插入图片描述
在立方体前面加个平面图:
在这里插入图片描述
现在有深度值了,修改下模板测试的代码:

	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	glEnable(GL_STENCIL_TEST);
	//模板测试总是通过
	glStencilFunc(GL_ALWAYS, 0, 0);
	//深度测试失败模板值加1
	glStencilOp(GL_KEEP, GL_INCR, GL_KEEP);
	cubeBatch.Draw();
	glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
	glDisable(GL_STENCIL_TEST);

	glDisable( GL_DEPTH_TEST ); 
	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	
	// Draw the front side cube
	cubeBatch.Draw();
	glEnable( GL_DEPTH_TEST );
	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	glDisable( GL_DEPTH_TEST ); 
	glEnable(GL_STENCIL_TEST);
	//模板值为0时绘制
	glStencilFunc(GL_EQUAL, 0, 0xff);

	shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBrown);
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	floorBatch.Draw();

效果如图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值