2006年10月4日

Shadow Volume详解(2)

然后重设模板测试比较函数:glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
绘制阴影体的所有背向视点的面
也就是当片于通过模板测试时,相应的模板缓存区域的值减一。接着红色区域+棕色区域的那个四边形被渲染。但是这个四边形位于红色的三角形的背后的部分无法通过深度测试,那个区域片元的位置比三角形离视点更远。













左图中棕色区域的模板缓存相应位置的值减1。经过这两次渲染,模板缓存中不为0的地方就是右边的淡蓝色区域减左边的棕色区域。
那个区域就是棕色区域下面的三角形区域,也就是阴影区
实际上标准的做法是把场景渲染两遍的,这个下面我会翻译。现在使用的是NeHe的做法,直接给整个屏幕蒙上一个蒙板,非阴影区颜色不变,阴影区颜色加深。


glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

//draw a shadowing rectangle covering the entire screen
glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glPushMatrix();
//将当前矩阵load indentity后,绘制任意大小的矩形都将覆盖整个屏幕
//xophiix告诉我,我才想起来的
glLoadIdentity();
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(-0.1f, 0.1f, -0.10f);
glVertex3f(-0.1f, -0.1f, -0.10f);
glVertex3f( 0.1f, 0.1f, -0.10f);
glVertex3f( 0.1f, -0.1f, -0.10f);
glEnd();
glPopMatrix();
然后就可以恢复OpenGL状态机设置,绘制物体本身。

没有评论: