如何在地面上绘制几个立方体,然后他们各自的阴影在随着光照的不停变化,
他们各自的阴影也在变化,而且他们的阴影遇见其他的立方体时会自动拐弯,
也就是说,一个立方体的影子可以显示在另外一个立方体的其中一个面上,
当然是由于影子在运动过程中,碰到了其他的立方体的影响。
请大家给一个思路吧
他们各自的阴影也在变化,而且他们的阴影遇见其他的立方体时会自动拐弯,
也就是说,一个立方体的影子可以显示在另外一个立方体的其中一个面上,
当然是由于影子在运动过程中,碰到了其他的立方体的影响。
请大家给一个思路吧
if(pDoc->Env.bHouseShading)
{ 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);
// ÖÆ×÷ÿ¸ö·¿ÎݵÄÒõÓ°Ä£°å¡£ 2004.2.13.
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);
}
} 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);
}
我的QQ:49561494
我个人觉得只要理论明白了,无论OpenGL还是D3D都是一个导入的问题了(大致上),当然,不可能忽视掉具体实现上的细节问题,祝你好运