本文整理汇总了C#中SharpDX.Direct3D9.Device.GetRenderTargetData方法的典型用法代码示例。如果您正苦于以下问题:C# Device.GetRenderTargetData方法的具体用法?C# Device.GetRenderTargetData怎么用?C# Device.GetRenderTargetData使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SharpDX.Direct3D9.Device
的用法示例。
在下文中一共展示了Device.GetRenderTargetData方法的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: DoCaptureRenderTarget
/// <summary>
/// Implementation of capturing from the render target of the Direct3D9 Device (or DeviceEx)
/// </summary>
/// <param name="device"></param>
void DoCaptureRenderTarget(Device device, string hook)
{
this.Frame();
try
{
#region Screenshot Request
// If we have issued the command to copy data to our render target, check if it is complete
bool qryResult;
if (_queryIssued && _requestCopy != null && _query.GetData(out qryResult, false))
{
// The GPU has finished copying data to _renderTargetCopy, we can now lock
// the data and access it on another thread.
_queryIssued = false;
// Lock the render target
SharpDX.Rectangle rect;
SharpDX.DataRectangle lockedRect = LockRenderTarget(_renderTargetCopy, out rect);
_renderTargetCopyLocked = true;
// Copy the data from the render target
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
lock (_lockRenderTarget)
{
ProcessCapture(rect.Width, rect.Height, lockedRect.Pitch, _renderTargetCopy.Description.Format.ToPixelFormat(), lockedRect.DataPointer, _requestCopy);
}
});
}
// Single frame capture request
if (this.Request != null)
{
DateTime start = DateTime.Now;
try
{
using (Surface renderTarget = device.GetRenderTarget(0))
{
int width, height;
// If resizing of the captured image, determine correct dimensions
if (Request.Resize != null && (renderTarget.Description.Width > Request.Resize.Value.Width || renderTarget.Description.Height > Request.Resize.Value.Height))
{
if (renderTarget.Description.Width > Request.Resize.Value.Width)
{
width = Request.Resize.Value.Width;
height = (int)Math.Round((renderTarget.Description.Height * ((double)Request.Resize.Value.Width / (double)renderTarget.Description.Width)));
}
else
{
height = Request.Resize.Value.Height;
width = (int)Math.Round((renderTarget.Description.Width * ((double)Request.Resize.Value.Height / (double)renderTarget.Description.Height)));
}
}
else
{
width = renderTarget.Description.Width;
height = renderTarget.Description.Height;
}
// If existing _renderTargetCopy, ensure that it is the correct size and format
if (_renderTargetCopy != null && (_renderTargetCopy.Description.Width != width || _renderTargetCopy.Description.Height != height || _renderTargetCopy.Description.Format != renderTarget.Description.Format))
{
// Cleanup resources
Cleanup();
}
// Ensure that we have something to put the render target data into
if (!_resourcesInitialised || _renderTargetCopy == null)
{
CreateResources(device, width, height, renderTarget.Description.Format);
}
// Resize from render target Surface to resolvedSurface (also deals with resolving multi-sampling)
device.StretchRectangle(renderTarget, _resolvedTarget, TextureFilter.None);
}
// If the render target is locked from a previous request unlock it
if (_renderTargetCopyLocked)
{
// Wait for the the ProcessCapture thread to finish with it
lock (_lockRenderTarget)
{
if (_renderTargetCopyLocked)
{
_renderTargetCopy.UnlockRectangle();
_renderTargetCopyLocked = false;
}
}
}
// Copy data from resolved target to our render target copy
device.GetRenderTargetData(_resolvedTarget, _renderTargetCopy);
//.........这里部分代码省略.........
示例2: HandleCaptureRequest
private void HandleCaptureRequest(Device device)
{
try
{
for (int i = 0; i < BUFFERS; i++)
{
bool tmp;
if (this.issuedQueries[i] && this.queries[i].GetData(out tmp, false))
{
this.issuedQueries[i] = false;
try
{
var lockedRect = this.surfaces[i].LockRectangle(LockFlags.ReadOnly);
this.surfaceDataPointer = lockedRect.DataPointer;
this.currentSurface = i;
this.surfaceLocked[i] = true;
}
catch (Exception ex)
{
DebugMessage(ex.ToString());
}
}
}
if (previousRequestId != null || lastRequestId != null)
{
this.previousRequestId = null;
int nextCapture = (curCapture == BUFFERS - 1) ? 0 : (curCapture + 1);
var sourceTexture = copySurfaces[curCapture];
try
{
using (var backbuffer = device.GetBackBuffer(0, 0))
{
device.StretchRectangle(backbuffer, sourceTexture, TextureFilter.None);
}
if (copyWait < BUFFERS - 1)
{
copyWait++;
}
else
{
var prevSourceTexture = copySurfaces[nextCapture];
var targetTexture = surfaces[nextCapture];
if (this.surfaceLocked[nextCapture])
{
lock (this.surfaceLocks[nextCapture])
{
this.surfaces[nextCapture].UnlockRectangle();
this.surfaceLocked[nextCapture] = false;
}
}
try
{
device.GetRenderTargetData(prevSourceTexture, targetTexture);
}
catch (Exception ex)
{
DebugMessage(ex.ToString());
}
this.queries[nextCapture].Issue(Issue.End);
this.issuedQueries[nextCapture] = true;
}
}
catch (Exception ex)
{
this.DebugMessage(ex.ToString());
}
curCapture = nextCapture;
}
}
catch (Exception e)
{
this.DebugMessage(e.ToString());
}
}
示例3: DoCaptureRenderTarget
//.........这里部分代码省略.........
width = renderTarget.Description.Width;
height = renderTarget.Description.Height;
}
// If existing _renderTargetCopy, ensure that it is the correct size and format
if (_renderTargetCopy != null &&
(_renderTargetCopy.Description.Width != width ||
_renderTargetCopy.Description.Height != height ||
_renderTargetCopy.Description.Format != renderTarget.Description.Format))
{
// Cleanup resources
Cleanup();
}
// Ensure that we have something to put the render target data into
if (!_resourcesInitialised || _renderTargetCopy == null)
{
CreateResources(device, width, height, renderTarget.Description.Format);
}
// Resize from render target Surface to resolvedSurface (also deals with resolving multi-sampling)
device.StretchRectangle(renderTarget, _resolvedTarget, TextureFilter.None);
}
// If the render target is locked from a previous request unlock it
if (_renderTargetCopyLocked)
{
// Wait for the the ProcessCapture thread to finish with it
lock (_lockRenderTarget)
{
if (_renderTargetCopyLocked)
{
_renderTargetCopy.UnlockRectangle();
_renderTargetCopyLocked = false;
}
}
}
// Copy data from resolved target to our render target copy
device.GetRenderTargetData(_resolvedTarget, _renderTargetCopy);
_requestCopy = Request.Clone();
_query.Issue(Issue.End);
_queryIssued = true;
}
finally
{
// We have completed the request - mark it as null so we do not continue to try to capture the same request
// Note: If you are after high frame rates, consider implementing buffers here to capture more frequently
// and send back to the host application as needed. The IPC overhead significantly slows down
// the whole process if sending frame by frame.
Request = null;
}
var end = DateTime.Now;
DebugMessage(hook + ": Capture time: " + (end - start));
}
#endregion
if (Config.ShowOverlay)
{
#region Draw Overlay
// Check if overlay needs to be initialised
if (_overlayEngine == null
|| _overlayEngine.Device.NativePointer != device.NativePointer
|| IsOverlayUpdatePending)
{
// Cleanup if necessary
if (_overlayEngine != null)
_overlayEngine.Dispose();
_overlayEngine = ToDispose(new DXOverlayEngine());
// Create Overlay
_overlayEngine.Overlays.Add(new Overlay
{
Elements = OverlayElements
});
_overlayEngine.Initialise(device);
IsOverlayUpdatePending = false;
}
// Draw Overlay(s)
else if (_overlayEngine != null)
{
foreach (var overlay in _overlayEngine.Overlays)
overlay.Frame();
_overlayEngine.Draw();
}
#endregion
}
}
catch (Exception e)
{
DebugMessage(e.ToString());
}
}
示例4: DoCaptureRenderTarget
/// <summary>
/// Implementation of capturing from the render target of the Direct3D9 Device (or DeviceEx)
/// </summary>
/// <param name="device"></param>
void DoCaptureRenderTarget(Device device, string hook)
{
this.Frame();
try
{
#region Screenshot Request
// Single frame capture request
if (this.Request != null)
{
DateTime start = DateTime.Now;
try
{
using (Surface renderTargetTemp = device.GetRenderTarget(0))
{
int width, height;
// TODO: If resizing the captured image is required it can be adjusted here
//if (renderTargetTemp.Description.Width > 1280)
//{
// width = 1280;
// height = (int)Math.Round((renderTargetTemp.Description.Height * (1280.0 / renderTargetTemp.Description.Width)));
//}
//else
{
width = renderTargetTemp.Description.Width;
height = renderTargetTemp.Description.Height;
}
// First ensure we have a Surface to the render target data into
if (_renderTarget == null)
{
// Create offscreen surface to use as copy of render target data
using (SwapChain sc = device.GetSwapChain(0))
{
_renderTarget = Surface.CreateOffscreenPlain(device, width, height, sc.PresentParameters.BackBufferFormat, Pool.SystemMemory);
}
}
// Create our resolved surface (resizing if necessary and to resolve any multi-sampling)
using (Surface resolvedSurface = Surface.CreateRenderTarget(device, width, height, renderTargetTemp.Description.Format, MultisampleType.None, 0, false))
{
// Resize from Render Surface to resolvedSurface
device.StretchRectangle(renderTargetTemp, resolvedSurface, TextureFilter.None);
// Get Render Data
device.GetRenderTargetData(resolvedSurface, _renderTarget);
}
}
if (Request != null)
ProcessRequest();
}
finally
{
// We have completed the request - mark it as null so we do not continue to try to capture the same request
// Note: If you are after high frame rates, consider implementing buffers here to capture more frequently
// and send back to the host application as needed. The IPC overhead significantly slows down
// the whole process if sending frame by frame.
Request = null;
}
DateTime end = DateTime.Now;
this.DebugMessage(hook + ": Capture time: " + (end - start).ToString());
}
#endregion
if (this.Config.ShowOverlay)
{
#region Draw frame rate
// TODO: font needs to be created and then reused, not created each frame!
using (SharpDX.Direct3D9.Font font = new SharpDX.Direct3D9.Font(device, new FontDescription()
{
Height = 16,
FaceName = "Arial",
Italic = false,
Width = 0,
MipLevels = 1,
CharacterSet = FontCharacterSet.Default,
OutputPrecision = FontPrecision.Default,
Quality = FontQuality.Antialiased,
PitchAndFamily = FontPitchAndFamily.Default | FontPitchAndFamily.DontCare,
Weight = FontWeight.Bold
}))
{
if (this.FPS.GetFPS() >= 1)
{
font.DrawText(null, String.Format("{0:N0} fps", this.FPS.GetFPS()), 5, 5, SharpDX.Color.Red);
}
if (this.TextDisplay != null && this.TextDisplay.Display)
{
font.DrawText(null, this.TextDisplay.Text, 5, 25, new SharpDX.ColorBGRA(255, 0, 0, (byte)Math.Round((Math.Abs(1.0f - TextDisplay.Remaining) * 255f))));
//.........这里部分代码省略.........
示例5: HandleCaptureRequest
private void HandleCaptureRequest(Device device)
{
try
{
bool tmp;
if (this.queryIssued && this.query.GetData(out tmp, false))
{
this.queryIssued = false;
var lockedRect = this.surface.LockRectangle(LockFlags.ReadOnly);
this.surfaceDataPointer = lockedRect.DataPointer;
this.surfaceLocked = true;
this.copyEvent.Set();
}
using (var backbuffer = device.GetBackBuffer(0, 0))
{
device.StretchRectangle(backbuffer, this.renderTarget, TextureFilter.None);
}
if (this.surfaceLocked)
{
lock (this.renderTargetLock)
{
if (this.surfaceLocked)
{
this.surface.UnlockRectangle();
this.surfaceLocked = false;
}
}
}
try
{
var cooplevel = device.TestCooperativeLevel();
if (cooplevel.Code == ResultCode.Success.Code)
{
device.GetRenderTargetData(this.renderTarget, this.surface);
this.query.Issue(Issue.End);
this.queryIssued = true;
}
else
{
this.DebugMessage(string.Format("DirectX Error: TestCooperativeLevel = {0}", cooplevel.Code));
}
}
catch (Exception ex)
{
this.DebugMessage(ex.ToString());
}
}
catch (Exception e)
{
this.DebugMessage(e.ToString());
}
}
示例6: HandleCaptureRequest
private void HandleCaptureRequest(Device device)
{
if (Request == null)
{
return;
}
try
{
bool tmp;
if (queryIssued && query.GetData(out tmp, false))
{
queryIssued = false;
var lockedRect = surface.LockRectangle(LockFlags.ReadOnly);
surfaceDataPointer = lockedRect.DataPointer;
surfaceLocked = true;
new Thread(HandleCaptureRequestThread).Start();
}
using (var backbuffer = device.GetBackBuffer(0, 0))
{
device.StretchRectangle(backbuffer, renderTarget, TextureFilter.None);
}
if (surfaceLocked)
{
lock (renderTargetLock)
{
if (!this.surfaceLocked)
{
return;
}
this.surface.UnlockRectangle();
this.surfaceLocked = false;
}
}
try
{
device.GetRenderTargetData(renderTarget, surface);
query.Issue(Issue.End);
queryIssued = true;
}
catch (Exception ex)
{
DebugMessage(ex.ToString());
}
}
catch (Exception e)
{
DebugMessage(e.ToString());
}
}
示例7: DoCaptureRenderTarget
/// <summary>
/// Implementation of capturing from the render target of the Direct3D9 Device (or DeviceEx)
/// </summary>
/// <param name="device"></param>
void DoCaptureRenderTarget(Device device, string hook)
{
this.Frame();
try
{
#region Screenshot Request
// If we have issued the command to copy data to our render target, check if it is complete
bool qryResult;
if (_queryIssued && _requestCopy != null && _query.GetData(out qryResult, false))
{
// The GPU has finished copying data to _renderTargetCopy, we can now lock
// the data and access it on another thread.
_queryIssued = false;
// Lock the render target
SharpDX.Rectangle rect;
SharpDX.DataRectangle lockedRect = LockRenderTarget(_renderTargetCopy, out rect);
_renderTargetCopyLocked = true;
// Copy the data from the render target
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
lock (_lockRenderTarget)
{
ProcessCapture(rect.Width, rect.Height, lockedRect.Pitch, _renderTargetCopy.Description.Format.ToPixelFormat(), lockedRect.DataPointer, _requestCopy);
}
});
}
// Single frame capture request
if (this.Request != null)
{
DateTime start = DateTime.Now;
try
{
using (Surface renderTarget = device.GetRenderTarget(0))
{
int width, height;
// If resizing of the captured image, determine correct dimensions
if (Request.Resize != null && (renderTarget.Description.Width > Request.Resize.Value.Width || renderTarget.Description.Height > Request.Resize.Value.Height))
{
if (renderTarget.Description.Width > Request.Resize.Value.Width)
{
width = Request.Resize.Value.Width;
height = (int)Math.Round((renderTarget.Description.Height * ((double)Request.Resize.Value.Width / (double)renderTarget.Description.Width)));
}
else
{
height = Request.Resize.Value.Height;
width = (int)Math.Round((renderTarget.Description.Width * ((double)Request.Resize.Value.Height / (double)renderTarget.Description.Height)));
}
}
else
{
width = renderTarget.Description.Width;
height = renderTarget.Description.Height;
}
// If existing _renderTargetCopy, ensure that it is the correct size and format
if (_renderTargetCopy != null && (_renderTargetCopy.Description.Width != width || _renderTargetCopy.Description.Height != height || _renderTargetCopy.Description.Format != renderTarget.Description.Format))
{
// Cleanup resources
Cleanup();
}
// Ensure that we have something to put the render target data into
if (!_resourcesInitialised || _renderTargetCopy == null)
{
CreateResources(device, width, height, renderTarget.Description.Format);
}
// Resize from render target Surface to resolvedSurface (also deals with resolving multi-sampling)
device.StretchRectangle(renderTarget, _resolvedTarget, TextureFilter.None);
}
// If the render target is locked from a previous request unlock it
if (_renderTargetCopyLocked)
{
// Wait for the the ProcessCapture thread to finish with it
lock (_lockRenderTarget)
{
if (_renderTargetCopyLocked)
{
_renderTargetCopy.UnlockRectangle();
_renderTargetCopyLocked = false;
}
}
}
// Copy data from resolved target to our render target copy
device.GetRenderTargetData(_resolvedTarget, _renderTargetCopy);
//.........这里部分代码省略.........
示例8: HandleCaptureRequest
private void HandleCaptureRequest(Device device)
{
try
{
if (_killThread)
{
return;
}
for (var i = 0; i < BUFFERS; i++)
{
bool tmp;
if (_issuedQueries[i]
&& _queries[i].GetData(out tmp, false))
{
_issuedQueries[i] = false;
var lockedRect = _surfaces[i].LockRectangle(LockFlags.ReadOnly);
_surfaceDataPointer = lockedRect.DataPointer;
_currentSurface = i;
_surfaceLocked[i] = true;
_copyReadySignal.Set();
}
}
if (_captureWaitHandle.WaitOne(0)
|| _copyWait < BUFFERS - 1)
{
var nextCapture = (_curCapture == BUFFERS - 1) ? 0 : (_curCapture + 1);
try
{
using (var backbuffer = device.GetBackBuffer(0, 0))
{
var sourceTexture = _copySurfaces[_curCapture];
device.StretchRectangle(backbuffer, sourceTexture, TextureFilter.None);
}
if (_copyWait < BUFFERS - 1)
{
_copyWait++;
}
else
{
var prevSourceTexture = _copySurfaces[nextCapture];
var targetTexture = _surfaces[nextCapture];
if (_surfaceLocked[nextCapture])
{
lock (_surfaceLocks[nextCapture])
{
_surfaces[nextCapture].UnlockRectangle();
_surfaceLocked[nextCapture] = false;
}
}
try
{
device.GetRenderTargetData(prevSourceTexture, targetTexture);
}
catch (Exception ex)
{
DebugMessage(ex.ToString());
}
_queries[nextCapture].Issue(Issue.End);
_issuedQueries[nextCapture] = true;
}
}
catch (Exception ex)
{
DebugMessage(ex.ToString());
}
finally
{
_captureWaitHandle.Reset();
_curCapture = nextCapture;
}
}
}
catch (Exception e)
{
DebugMessage(e.ToString());
}
}
示例9: DoCaptureRenderTarget
/// <summary>
/// Implementation of capturing from the render target of the Direct3D9 Device (or DeviceEx)
/// </summary>
/// <param name="device"></param>
void DoCaptureRenderTarget(Device device, string hook)
{
try
{
#region Screenshot Request
// Single frame capture request
if (this.Request != null)
{
DateTime start = DateTime.Now;
try
{
using (Surface renderTargetTemp = device.GetRenderTarget(0))
{
int width, height;
// TODO: If resizing the captured image is required it can be adjusted here
//if (renderTargetTemp.Description.Width > 1280)
//{
// width = 1280;
// height = (int)Math.Round((renderTargetTemp.Description.Height * (1280.0 / renderTargetTemp.Description.Width)));
//}
//else
{
width = renderTargetTemp.Description.Width;
height = renderTargetTemp.Description.Height;
}
// First ensure we have a Surface to the render target data into
if (_renderTarget == null)
{
// Create offscreen surface to use as copy of render target data
using (SwapChain sc = device.GetSwapChain(0))
{
_renderTarget = Surface.CreateOffscreenPlain(device, width, height,
sc.PresentParameters.BackBufferFormat, Pool.SystemMemory);
}
}
// Create our resolved surface (resizing if necessary and to resolve any multi-sampling)
using (
Surface resolvedSurface = Surface.CreateRenderTarget(device, width, height,
renderTargetTemp.Description.Format, MultisampleType.None, 0, false))
{
// Resize from Render Surface to resolvedSurface
device.StretchRectangle(renderTargetTemp, resolvedSurface, TextureFilter.None);
// Get Render Data
device.GetRenderTargetData(resolvedSurface, _renderTarget);
}
}
if (Request != null)
ProcessRequest();
}
finally
{
// We have completed the request - mark it as null so we do not continue to try to capture the same request
// Note: If you are after high frame rates, consider implementing buffers here to capture more frequently
// and send back to the host application as needed. The IPC overhead significantly slows down
// the whole process if sending frame by frame.
Request = null;
}
DateTime end = DateTime.Now;
this.DebugMessage(hook + ": Capture time: " + (end - start).ToString());
}
#endregion
if (this.Config.ShowOverlay)
{
// SHIT
this.Frame();
#region Draw frame rate
// TODO: font needs to be created and then reused, not created each frame!
using (var font = new SharpDX.Direct3D9.Font(device, new FontDescription()
{
Height = 26,
FaceName = "Quartz MS",
Italic = false,
Width = 0,
MipLevels = 1,
CharacterSet = FontCharacterSet.Default,
OutputPrecision = FontPrecision.Default,
Quality = FontQuality.Antialiased,
PitchAndFamily = FontPitchAndFamily.Default | FontPitchAndFamily.DontCare,
Weight = FontWeight.Normal
}))
{
// Make a Texture from a file...
//.........这里部分代码省略.........
示例10: DoCaptureRenderTarget
private void DoCaptureRenderTarget(Device device, string hook)
{
try
{
if (isCapturing && signalEnd.WaitOne(0))
{
ClearD3D9Data();
isCapturing = false;
stopRequested = true;
}
if (!isCapturing)
{
return;
}
if (!bHasTextures)
{
using (Surface backbuffer = device.GetRenderTarget(0))
{
copyData.format = (int)backbuffer.Description.Format;
copyData.width = backbuffer.Description.Width;
copyData.height = backbuffer.Description.Height;
}
DoD3DHooks(device);
}
if (!bHasTextures)
{
return;
}
long timeVal = DateTime.Now.Ticks;
long frameTime = 1000000 / targetFps; // lock at 30 fps
if (frameTime != 0)
{
for (var i = 0; i < NUM_BUFFERS; i++)
{
if (issuedQueries[i])
{
bool tmp;
if (queries[i].GetData(out tmp, false))
{
issuedQueries[i] = false;
Surface targetTexture = textures[i];
try
{
var lockedRect = targetTexture.LockRectangle(LockFlags.ReadOnly);
pCopyData = lockedRect.DataPointer;
curCPUTexture = i;
lockedTextures[i] = true;
hCopyEvent.Set();
}
catch (Exception ex)
{
DebugMessage(ex.ToString());
}
}
}
}
long timeElapsed = timeVal - lastTime;
if (timeElapsed >= frameTime)
{
lastTime += frameTime;
if (timeElapsed > frameTime * 2)
{
lastTime = timeVal;
}
var nextCapture = (curCapture == NUM_BUFFERS - 1) ? 0 : (curCapture + 1);
Surface sourceTexture = copyD3D9Textures[curCapture];
using (var backbuffer = device.GetBackBuffer(0, 0))
{
device.StretchRectangle(backbuffer, sourceTexture, TextureFilter.None);
}
if (copyWait < (NUM_BUFFERS - 1))
{
copyWait++;
}
else
{
Surface prevSourceTexture = copyD3D9Textures[nextCapture];
Surface targetTexture = textures[nextCapture];
if (lockedTextures[nextCapture])
{
Monitor.Enter(dataMutexes[nextCapture]);
targetTexture.UnlockRectangle();
lockedTextures[nextCapture] = false;
Monitor.Exit(dataMutexes[nextCapture]);
}
try
{
device.GetRenderTargetData(prevSourceTexture, targetTexture);
//.........这里部分代码省略.........