本文整理汇总了C++中Sky::GetPssmLambda方法的典型用法代码示例。如果您正苦于以下问题:C++ Sky::GetPssmLambda方法的具体用法?C++ Sky::GetPssmLambda怎么用?C++ Sky::GetPssmLambda使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Sky
的用法示例。
在下文中一共展示了Sky::GetPssmLambda方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: QueueDraw
void LightList::QueueDraw(Renderer& rRenderer, const Sky& rSky, const Camera& rCamera, const float sceneDepthMin, const float sceneDepthMax,
RdrLightingMethod lightingMethod, RdrLightResources* pOutResources)
{
Camera lightCamera;
int curShadowMapIndex = 0;
int curShadowCubeMapIndex = 0;
int shadowMapsThisFrame = 0;
// Update shadow casting lights and the global light constants
// todo: Choose shadow lights based on location and dynamic object movement
GlobalLightData* pGlobalLights = (GlobalLightData*)RdrFrameMem::AllocAligned(sizeof(GlobalLightData), 16);
// Temporarily add sky light to the light list.
m_directionalLights.push(rSky.GetSunLight());
for (uint i = 0, count = m_directionalLights.size(); i < count; ++i)
{
DirectionalLight& rDirLight = m_directionalLights[i];
int remainingShadowMaps = MAX_SHADOW_MAPS - curShadowMapIndex - 1;
const int kNumCascades = 4;
if (remainingShadowMaps >= kNumCascades)
{
// Directional lights always change because they're based on camera position/rotation
rDirLight.shadowMapIndex = curShadowMapIndex;
Rect viewport(0.f, 0.f, (float)s_shadowMapSize, (float)s_shadowMapSize);
float zMin = sceneDepthMin;
float zMax = sceneDepthMax;
float zDiff = (zMax - zMin);
float nearDepth = zMin;
float lamda = rSky.GetPssmLambda();
for (int iPartition = 0; iPartition < kNumCascades; ++iPartition)
{
float zUni = zMin + (zDiff / kNumCascades) * (iPartition + 1);
float zLog = zMin * powf(zMax / zMin, (iPartition + 1) / (float)kNumCascades);
float farDepth = lamda * zLog + (1.f - lamda) * zUni;
Vec3 center = rCamera.GetPosition() + rCamera.GetDirection() * ((farDepth + nearDepth) * 0.5f);
Matrix44 lightViewMtx = getLightViewMatrix(center, rDirLight.direction);
Quad nearQuad = rCamera.GetFrustumQuad(nearDepth);
QuadTransform(nearQuad, lightViewMtx);
Quad farQuad = rCamera.GetFrustumQuad(farDepth);
QuadTransform(farQuad, lightViewMtx);
Vec3 boundsMin(FLT_MAX, FLT_MAX, FLT_MAX);
Vec3 boundsMax(-FLT_MAX, -FLT_MAX, -FLT_MAX);
accumQuadMinMax(nearQuad, boundsMin, boundsMax);
accumQuadMinMax(farQuad, boundsMin, boundsMax);
float height = (boundsMax.y - boundsMin.y);
float width = (boundsMax.x - boundsMin.x);
lightCamera.SetAsOrtho(center, rDirLight.direction, std::max(width, height), -500.f, 500.f);
rRenderer.QueueShadowMapPass(lightCamera, m_shadowMapDepthViews[curShadowMapIndex], viewport);
Matrix44 mtxView;
Matrix44 mtxProj;
lightCamera.GetMatrices(mtxView, mtxProj);
pGlobalLights->shadowData[curShadowMapIndex].mtxViewProj = Matrix44Multiply(mtxView, mtxProj);
pGlobalLights->shadowData[curShadowMapIndex].mtxViewProj = Matrix44Transpose(pGlobalLights->shadowData[curShadowMapIndex].mtxViewProj);
pGlobalLights->shadowData[curShadowMapIndex].partitionEndZ = (iPartition == kNumCascades - 1) ? FLT_MAX : farDepth;
++shadowMapsThisFrame;
++curShadowMapIndex;
nearDepth = farDepth;
}
}
else
{
rDirLight.shadowMapIndex = -1;
}
}
for (uint i = 0, count = m_spotLights.size(); i < count; ++i)
{
SpotLight& rSpotLight = m_spotLights[i];
int remainingShadowMaps = MAX_SHADOW_MAPS - curShadowMapIndex - 1;
if (remainingShadowMaps)
{
Matrix44 mtxView;
Matrix44 mtxProj;
float angle = rSpotLight.outerConeAngle + Maths::DegToRad(5.f);
lightCamera.SetAsPerspective(rSpotLight.position, rSpotLight.direction, angle * 2.f, 1.f, 0.1f, 1000.f);
lightCamera.GetMatrices(mtxView, mtxProj);
pGlobalLights->shadowData[curShadowMapIndex].mtxViewProj = Matrix44Multiply(mtxView, mtxProj);
pGlobalLights->shadowData[curShadowMapIndex].mtxViewProj = Matrix44Transpose(pGlobalLights->shadowData[curShadowMapIndex].mtxViewProj);
Rect viewport(0.f, 0.f, (float)s_shadowMapSize, (float)s_shadowMapSize);
rRenderer.QueueShadowMapPass(lightCamera, m_shadowMapDepthViews[curShadowMapIndex], viewport);
rSpotLight.shadowMapIndex = curShadowMapIndex;
++shadowMapsThisFrame;
++curShadowMapIndex;
}
//.........这里部分代码省略.........