见如下代码及分析——//初始化
glClearStencil(0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);//启用模板缓存
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_NEVER,0x0,0x0);
glStencilOp(GL_INCR,GL_INCR,GL_INCR);//用如下代码画了一个三维物体
glEnable(GL_LIGNTING);
glEnable(GL_LIGNT0);
//...设置光照参数
DrawObject();
glEnable(GL_LIGNT0);
glDisable(GL_LIGHTING);//按照上面的设置,代表该三维物体区域的模板缓冲区值为1,背景为0glStencilFunc(GL_NOTEQUAL,0x1,0x1);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);glColor3f(1.0f,1.0f,1.0f);
glBegin(GL_QUADS);
//...此处画一个与上面那个三维物体相交的白色矩形
glEnd();那么理论上在这个平面上的那些背景区域(模板值为0)能通过模板测试,被画成白色矩形.
而那些与三维物体相交的平面上像素则不能通过测试,这些像素用背景色代替那么结果应该是会出现这个矩形平面与那个三维物体的截面形状才对!
但是为什么只出现了一个白色矩形呢?看不到相交的部分?另,我将DrawObject()用一些简单的画线函数取代之后,则能出现理论上的效果。不知道是怎么一回事了,各位请指点一二!
glClearStencil(0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);//启用模板缓存
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_NEVER,0x0,0x0);
glStencilOp(GL_INCR,GL_INCR,GL_INCR);//用如下代码画了一个三维物体
glEnable(GL_LIGNTING);
glEnable(GL_LIGNT0);
//...设置光照参数
DrawObject();
glEnable(GL_LIGNT0);
glDisable(GL_LIGHTING);//按照上面的设置,代表该三维物体区域的模板缓冲区值为1,背景为0glStencilFunc(GL_NOTEQUAL,0x1,0x1);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);glColor3f(1.0f,1.0f,1.0f);
glBegin(GL_QUADS);
//...此处画一个与上面那个三维物体相交的白色矩形
glEnd();那么理论上在这个平面上的那些背景区域(模板值为0)能通过模板测试,被画成白色矩形.
而那些与三维物体相交的平面上像素则不能通过测试,这些像素用背景色代替那么结果应该是会出现这个矩形平面与那个三维物体的截面形状才对!
但是为什么只出现了一个白色矩形呢?看不到相交的部分?另,我将DrawObject()用一些简单的画线函数取代之后,则能出现理论上的效果。不知道是怎么一回事了,各位请指点一二!
解决方案 »
- 想学SDK,到底怎么办?
- 请教关于应用程序启动画面的问题
- OpenGL高手请进
- 怎样把几张长宽一样的GIF图片拼在一起(横竖都可以),再保存为JPG格式
- 如何能编程实现自己机器在网络上发出的的所用数据。是发出的...
- 为什么在Release文件夹里面没有出现可执行程序阿?
- 怎样用CRecordset实行记录向前翻
- 运行在套间线程中的COM对象,不需要进行同步处理,那么这样的COM对象是线程安全的还是不是线程安全的??
- 我要在程序使用GetProcessIdFromName函数,我应该包含什么头文件呢??100分啊!!
- 帮我看看,客户端怎么连接不上服务器?
- 在一个局域网内用SOCKET通信,如何通过IP获得计算机名称?
- 我想问一个问题学C++在win平台上还有用吗
{ glClearStencil(0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
/// glColor3f(0.0f,0.0f,0.0f);
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);
/// glEnable(GL_BLEND);
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);
/// glEnable(GL_LIGHT0);
DrawObjectAll(); glStencilFunc(GL_EQUAL, 0x00, 0xffffffff); // draw lit part //
glEnable(GL_LIGHT0);
DrawObjectAll(); glDepthFunc(GL_LESS);
glDisable(GL_STENCIL_TEST);
}