如果实现物体之间的阴影效果。我的场景中有多个物体,和几个光源,我该如果计算物体之间的阴影效果。
我有一个例子是如果实现几个物体在墙上和地板的阴影效果,但是真实的物体不一定是平面的。阴影的Matrix不是固定的。这种的物体该如何考虑。如果知道那个物体是在另一个物体前(相对光)。甚至是相交的两个物体。我的例子在这方面是预知物体的位置。在实际应用中就不一样了。
直接把深度检测关闭了是不行的。希望有兴趣的朋友一起探讨一下。
我有一个例子是如果实现几个物体在墙上和地板的阴影效果,但是真实的物体不一定是平面的。阴影的Matrix不是固定的。这种的物体该如何考虑。如果知道那个物体是在另一个物体前(相对光)。甚至是相交的两个物体。我的例子在这方面是预知物体的位置。在实际应用中就不一样了。
直接把深度检测关闭了是不行的。希望有兴趣的朋友一起探讨一下。
{ 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);
glDisable(GL_LIGHT0);
DrawObjectAll(); /// render scene in depth buffer
glDepthMask(GL_FALSE); glEnable(GL_STENCIL_TEST);
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);
}
void HouseShadingStencil_p(CBoolArray& LightDirectionArray,
long lNumPoint, long lFaces, GLuint& m_iShadowList)
{
int i; // m = PolyLine3D.Point3DArray.GetSize();
// m1 = PolygonRoofList.GetCount();
/// glDepthMask(GL_FALSE);
if(LightDirectionArray.GetSize()<1) //2004.2.12.Ð޸ġ£
{
return;
// i = i;
}
for(i=0;i<lFaces;i++)
{
// if(i<0)continue;
// if(i>0)break;
if(i<lNumPoint)
if(!LightDirectionArray[i])continue;
/// if(i<m-1)continue;
/// if(i>m-1)break;
// glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
// glGetIntegerv(GL_STENCIL_REF, &j);
// glStencilMask(0x1);
// glStencilFunc(GL_ALWAYS, 0x1, 0xffffffff);
// glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
// glGetIntegerv(GL_STENCIL_REF, &j);
/// glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glStencilFunc(GL_ALWAYS, 0x1, 0xffffffff);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
glCullFace(GL_BACK); /* increment using front face of shadow volume */
glCallList(m_iShadowList+i);
// glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
// glGetIntegerv(GL_STENCIL_REF, &j);
// if(i<m-1)
{
glStencilFunc(GL_EQUAL, 0x01, 0xffffffff);
// glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
// glGetIntegerv(GL_STENCIL_REF, &j);
// glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO);
// glStencilFunc(GL_NOTEQUAL, 0, 0xffffffff);
glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
glCullFace(GL_FRONT); /* increment using front face of shadow volume */
glCallList(m_iShadowList+i);
// glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
// glGetIntegerv(GL_STENCIL_REF, &j);
}/// glStencilMask(0x2);
/// glStencilFunc(GL_ALWAYS, 0x1, 0xffffffff);
// glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
// glGetIntegerv(GL_STENCIL_REF, &j);
/// glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
// glStencilMask(~0u);
// glGetIntegerv(GL_STENCIL_VALUE_MASK, &j);
// glGetIntegerv(GL_STENCIL_REF, &j);
/// glCullFace(GL_BACK); /* increment using front face of shadow volume */
/// glCallList(m_iShadowList+i);
}
}
真正用在场景或游戏中的都用NV SDK来做,
CG.DLL,很多游戏引擎中都是这样用的,实时阴影,
楼主不妨去找些免费引擎代码看看