用opengl的画圆柱函数画两个圆柱两个圆柱进行布尔运算,用摸板缓存计算出两个圆柱的差,进行绘制。glCullFace(GL_BACK);
glDepthFunc(GL_LESS);
glDepthMask(GL_FALSE);
glStencilFunc(GL_ALWAYS,stencilCode,~0);
glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
shape->draw();
glDepthFunc(GL_GREATER);//GL_GREATER GL_GEQUAL
glDepthMask(GL_TRUE);
glCullFace(GL_FRONT);
glStencilFunc(GL_EQUAL,stencilCode,~0);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
shape->draw();
现在的问题是摸板缓存测试的通过点并写入深度缓存,全在多边形的边上。多边形的面上点没通过,这是为什么。增加多边形可以表现出圆柱被挖去一块,可多边形很多,影响速度
glDepthFunc(GL_LESS);
glDepthMask(GL_FALSE);
glStencilFunc(GL_ALWAYS,stencilCode,~0);
glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
shape->draw();
glDepthFunc(GL_GREATER);//GL_GREATER GL_GEQUAL
glDepthMask(GL_TRUE);
glCullFace(GL_FRONT);
glStencilFunc(GL_EQUAL,stencilCode,~0);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
shape->draw();
现在的问题是摸板缓存测试的通过点并写入深度缓存,全在多边形的边上。多边形的面上点没通过,这是为什么。增加多边形可以表现出圆柱被挖去一块,可多边形很多,影响速度
解决方案 »
- com(executable类型)中调用dll后,不能创建com对象。怎么办?
- m_stringWindowText是什么意思 哪都找不到 帮帮忙吧 高手们
- 如何在游戏中实现文字雷达,谁有这方面的算法。?
- 求助怎么通过指定的url地址获得它的html内容。
- GOOGLE有一个桌面搜索软件,用过的来
- 怎么样改变xp风格的EDIT控件的背景颜色?
- 新手问个问题,求解答
- C语言如何实现数据库中的数据存入链表
- 请问我在C***View的初始化里面调用GetClientRect()为什么出错而在OnDraw()却正确?
- 请栩栩如生地描绘一下“句柄”这个词,和它的用法
- 有一个c的关于tcpip的小程序,不知道位身莫不对???
- 高分急求助!!寻找一个合适图象处理系统,版主帮忙置顶二天吧,谢谢
glStencilFunc(GL_ALWAYS, 1, 2); //第一个值必须为1才有效// Always Passes, 1
//Bit Plane, 1 As Mask
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glDisable(GL_DEPTH_TEST);shape->draw();
glEnable(GL_DEPTH_TEST);
glColorMask(1,1,1,1);// Was Drawn)
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // 不改变Stencil Buffer
glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); shape->draw();
if(pDoc->Env.bHouseShading)
{
/* glClearStencil(127);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
DrawObjectAll(); /// render scene in depth buffer
glDepthMask(GL_FALSE); glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 127, 127);
glEnable(GL_CULL_FACE);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
glCullFace(GL_BACK);
pDoc->DataBlock.DrawHouseShading(pDoc->Env); glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
glCullFace(GL_FRONT);
pDoc->DataBlock.DrawHouseShading(pDoc->Env); glCullFace(GL_BACK);
glDisable(GL_CULL_FACE);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glDepthMask(GL_TRUE);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthFunc(GL_LEQUAL);
glStencilFunc(GL_NOTEQUAL, 127, 127); // draw shadowed part //
glDisable(GL_LIGHT0);
DrawObjectAll(); glStencilFunc(GL_EQUAL, 127, 127); // draw lit part //
glEnable(GL_LIGHT0);
DrawObjectAll(); glDepthFunc(GL_LESS);
glDisable(GL_STENCIL_TEST); */ glClearStencil(0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
DrawObjectAll(); /// render scene in depth buffer
glDepthMask(GL_FALSE); glEnable(GL_STENCIL_TEST);
/* glStencilFunc(GL_ALWAYS, 127, 127);
glEnable(GL_CULL_FACE);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
glCullFace(GL_BACK);
pDoc->DataBlock.HouseShadingVolume(pDoc->Env); glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
glCullFace(GL_FRONT);
pDoc->DataBlock.HouseShadingVolume(pDoc->Env);*/
pDoc->DataBlock.MakeShadingStencil(pDoc->Env); glCullFace(GL_BACK);
glDisable(GL_CULL_FACE);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glDepthMask(GL_TRUE);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthFunc(GL_LEQUAL);
glStencilFunc(GL_NOTEQUAL, 0x00, 0xffffffff); // draw shadowed part //
glDisable(GL_LIGHT0);
DrawObjectAll(); glStencilFunc(GL_EQUAL, 0x00, 0xffffffff); // draw lit part //
glEnable(GL_LIGHT0);
DrawObjectAll(); glDepthFunc(GL_LESS);
glDisable(GL_STENCIL_TEST);
}
拷一段程序,供参考