本文整理汇总了C#中RenderContext.ThrowIfSceneMissing方法的典型用法代码示例。如果您正苦于以下问题:C# RenderContext.ThrowIfSceneMissing方法的具体用法?C# RenderContext.ThrowIfSceneMissing怎么用?C# RenderContext.ThrowIfSceneMissing使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类RenderContext
的用法示例。
在下文中一共展示了RenderContext.ThrowIfSceneMissing方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Render
public override void Render(IList<SceneNode> nodes, RenderContext context, RenderOrder order)
{
if (nodes == null)
throw new ArgumentNullException("nodes");
if (context == null)
throw new ArgumentNullException("context");
int numberOfNodes = nodes.Count;
if (numberOfNodes == 0)
return;
context.ThrowIfCameraMissing();
context.ThrowIfSceneMissing();
var originalRenderTarget = context.RenderTarget;
var originalViewport = context.Viewport;
var originalReferenceNode = context.ReferenceNode;
var cameraNode = context.CameraNode;
// Update SceneNode.LastFrame for all visible nodes.
int frame = context.Frame;
cameraNode.LastFrame = frame;
// The scene node renderer should use the light camera instead of the player camera.
context.CameraNode = _perspectiveCameraNode;
context.Technique = "Omnidirectional";
var graphicsService = context.GraphicsService;
var graphicsDevice = graphicsService.GraphicsDevice;
var renderTargetPool = graphicsService.RenderTargetPool;
var savedRenderState = new RenderStateSnapshot(graphicsDevice);
for (int i = 0; i < numberOfNodes; i++)
{
var lightNode = nodes[i] as LightNode;
if (lightNode == null)
continue;
var shadow = lightNode.Shadow as CubeMapShadow;
if (shadow == null)
continue;
var light = lightNode.Light as PointLight;
if (light == null)
throw new GraphicsException("CubeMapShadow can only be used with a PointLight.");
// LightNode is visible in current frame.
lightNode.LastFrame = frame;
if (shadow.ShadowMap == null)
{
shadow.ShadowMap = renderTargetPool.ObtainCube(
new RenderTargetFormat(
shadow.PreferredSize,
null,
false,
shadow.Prefer16Bit ? SurfaceFormat.HalfSingle : SurfaceFormat.Single,
DepthFormat.Depth24));
}
((PerspectiveProjection)_perspectiveCameraNode.Camera.Projection).SetFieldOfView(
ConstantsF.PiOver2, 1, shadow.Near, light.Range);
// World units per texel at a planar distance of 1 world unit.
float unitsPerTexel = _perspectiveCameraNode.Camera.Projection.Width / (shadow.ShadowMap.Size * shadow.Near);
// Convert depth bias from "texel" to world space.
// Minus to move receiver closer to light.
shadow.EffectiveDepthBias = -shadow.DepthBias * unitsPerTexel;
// Convert normal offset from "texel" to world space.
shadow.EffectiveNormalOffset = shadow.NormalOffset * unitsPerTexel;
var pose = lightNode.PoseWorld;
context.ReferenceNode = lightNode;
context.Object = shadow;
bool shadowMapContainsSomething = false;
for (int side = 0; side < 6; side++)
{
context.Data[RenderContextKeys.ShadowTileIndex] = BoxedIntegers[side];
graphicsDevice.SetRenderTarget(shadow.ShadowMap, CubeMapFaces[side]);
// context.RenderTarget = shadow.ShadowMap; // TODO: Support cube maps targets in the render context.
context.Viewport = graphicsDevice.Viewport;
graphicsDevice.Clear(Color.White);
_perspectiveCameraNode.View = Matrix44F.CreateLookAt(
pose.Position,
pose.ToWorldPosition(CubeMapForwardVectors[side]),
pose.ToWorldDirection(CubeMapUpVectors[side]));
// Abort if this cube map frustum does not touch the camera frustum.
if (!context.Scene.HaveContact(cameraNode, _perspectiveCameraNode))
continue;
graphicsDevice.DepthStencilState = DepthStencilState.Default;
//.........这里部分代码省略.........
示例2: Render
public override void Render(IList<SceneNode> nodes, RenderContext context, RenderOrder order)
{
if (nodes == null)
throw new ArgumentNullException("nodes");
if (context == null)
throw new ArgumentNullException("context");
int numberOfNodes = nodes.Count;
if (numberOfNodes == 0)
return;
// Note: The camera node is not used by the StandardShadowMapRenderer.
// Still throw an exception if null for consistency. (All other shadow map
// renderers need a camera node.)
context.ThrowIfCameraMissing();
context.ThrowIfSceneMissing();
var originalRenderTarget = context.RenderTarget;
var originalViewport = context.Viewport;
var originalReferenceNode = context.ReferenceNode;
var cameraNode = context.CameraNode;
// Update SceneNode.LastFrame for all visible nodes.
int frame = context.Frame;
cameraNode.LastFrame = frame;
context.Technique = "Default";
var graphicsService = context.GraphicsService;
var graphicsDevice = graphicsService.GraphicsDevice;
var savedRenderState = new RenderStateSnapshot(graphicsDevice);
for (int i = 0; i < numberOfNodes; i++)
{
var lightNode = nodes[i] as LightNode;
if (lightNode == null)
continue;
var shadow = lightNode.Shadow as StandardShadow;
if (shadow == null)
continue;
// LightNode is visible in current frame.
lightNode.LastFrame = frame;
// Get a new shadow map if necessary.
if (shadow.ShadowMap == null)
{
shadow.ShadowMap = graphicsService.RenderTargetPool.Obtain2D(
new RenderTargetFormat(
shadow.PreferredSize,
shadow.PreferredSize,
false,
shadow.Prefer16Bit ? SurfaceFormat.HalfSingle : SurfaceFormat.Single,
DepthFormat.Depth24));
}
// Create a suitable shadow camera.
CameraNode lightCameraNode;
if (lightNode.Light is ProjectorLight)
{
var light = (ProjectorLight)lightNode.Light;
if (light.Projection is PerspectiveProjection)
{
var lp = (PerspectiveProjection)light.Projection;
var cp = (PerspectiveProjection)_perspectiveCameraNode.Camera.Projection;
cp.SetOffCenter(lp.Left, lp.Right, lp.Bottom, lp.Top, lp.Near, lp.Far);
lightCameraNode = _perspectiveCameraNode;
}
else //if (light.Projection is OrthographicProjection)
{
var lp = (OrthographicProjection)light.Projection;
var cp = (OrthographicProjection)_orthographicCameraNode.Camera.Projection;
cp.SetOffCenter(lp.Left, lp.Right, lp.Bottom, lp.Top, lp.Near, lp.Far);
lightCameraNode = _orthographicCameraNode;
}
}
else if (lightNode.Light is Spotlight)
{
var light = (Spotlight)lightNode.Light;
var cp = (PerspectiveProjection)_perspectiveCameraNode.Camera.Projection;
cp.SetFieldOfView(2 * light.CutoffAngle, 1, shadow.DefaultNear, light.Range);
lightCameraNode = _perspectiveCameraNode;
}
else
{
throw new GraphicsException("StandardShadow can only be used with a Spotlight or a ProjectorLight.");
}
lightCameraNode.PoseWorld = lightNode.PoseWorld;
// Store data for use in StandardShadowMaskRenderer.
shadow.Near = lightCameraNode.Camera.Projection.Near;
shadow.Far = lightCameraNode.Camera.Projection.Far;
shadow.View = lightCameraNode.PoseWorld.Inverse;
shadow.Projection = lightCameraNode.Camera.Projection;
//.........这里部分代码省略.........
示例3: Render
public override void Render(IList<SceneNode> nodes, RenderContext context, RenderOrder order)
{
if (nodes == null)
throw new ArgumentNullException("nodes");
if (context == null)
throw new ArgumentNullException("context");
int numberOfNodes = nodes.Count;
if (numberOfNodes == 0)
return;
context.ThrowIfCameraMissing();
context.ThrowIfSceneMissing();
var originalRenderTarget = context.RenderTarget;
var originalViewport = context.Viewport;
var originalReferenceNode = context.ReferenceNode;
// Camera properties
var cameraNode = context.CameraNode;
var cameraPose = cameraNode.PoseWorld;
var projection = cameraNode.Camera.Projection;
if (!(projection is PerspectiveProjection))
throw new NotImplementedException(
"Cascaded shadow maps not yet implemented for scenes with orthographic camera.");
float fieldOfViewY = projection.FieldOfViewY;
float aspectRatio = projection.AspectRatio;
// Update SceneNode.LastFrame for all visible nodes.
int frame = context.Frame;
cameraNode.LastFrame = frame;
// The scene node renderer should use the light camera instead of the player camera.
context.CameraNode = _orthographicCameraNode;
context.Technique = "Directional";
var graphicsService = context.GraphicsService;
var graphicsDevice = graphicsService.GraphicsDevice;
var savedRenderState = new RenderStateSnapshot(graphicsDevice);
for (int i = 0; i < numberOfNodes; i++)
{
var lightNode = nodes[i] as LightNode;
if (lightNode == null)
continue;
var shadow = lightNode.Shadow as CascadedShadow;
if (shadow == null)
continue;
// LightNode is visible in current frame.
lightNode.LastFrame = frame;
var format = new RenderTargetFormat(
shadow.PreferredSize * shadow.NumberOfCascades,
shadow.PreferredSize,
false,
shadow.Prefer16Bit ? SurfaceFormat.HalfSingle : SurfaceFormat.Single,
DepthFormat.Depth24);
bool allLocked = shadow.IsCascadeLocked[0] && shadow.IsCascadeLocked[1] && shadow.IsCascadeLocked[2] && shadow.IsCascadeLocked[3];
if (shadow.ShadowMap == null)
{
shadow.ShadowMap = graphicsService.RenderTargetPool.Obtain2D(format);
allLocked = false; // Need to render shadow map.
}
// If we can reuse the whole shadow map texture, abort early.
if (allLocked)
continue;
_csmSplitDistances[0] = projection.Near;
_csmSplitDistances[1] = shadow.Distances.X;
_csmSplitDistances[2] = shadow.Distances.Y;
_csmSplitDistances[3] = shadow.Distances.Z;
_csmSplitDistances[4] = shadow.Distances.W;
// (Re-)Initialize the array for cached matrices in the CascadedShadow.
if (shadow.ViewProjections == null || shadow.ViewProjections.Length < shadow.NumberOfCascades)
shadow.ViewProjections = new Matrix[shadow.NumberOfCascades];
// Initialize the projection matrices to an empty matrix.
// The unused matrices should not contain valid projections because
// CsmComputeSplitOptimized in CascadedShadowMask.fxh should not choose
// the wrong cascade.
for (int j = 0; j < shadow.ViewProjections.Length; j++)
{
if (!shadow.IsCascadeLocked[j]) // Do not delete cached info for cached cascade.
shadow.ViewProjections[j] = new Matrix();
}
// If some cascades are cached, we have to create a new shadow map and copy
// the old cascades into the new shadow map.
if (shadow.IsCascadeLocked[0] || shadow.IsCascadeLocked[1] || shadow.IsCascadeLocked[2] || shadow.IsCascadeLocked[3])
{
var oldShadowMap = shadow.ShadowMap;
shadow.ShadowMap = graphicsService.RenderTargetPool.Obtain2D(new RenderTargetFormat(oldShadowMap));
//.........这里部分代码省略.........