我使用SlimDX和WPF编写了一些代码,我希望最终结果是一个红色的屏幕。
不幸的是,我得到的只是一个黑色的屏幕。
这是在windows 7上。
有人能看到我遗漏了什么吗?
我之所以使用一个单独的曲面作为D3DImage的后台缓冲区,是因为我需要多个视图。我认为绘制分开的表面,而不是设备的初始缓冲将是最好的方式来实现这一点。
不管怎么说,用密码..。
免责声明:请忽略那些糟糕的代码,这完全是作为丢弃代码编写的,这样我就可以知道如何实现我所追求的目标。
这是我的窗户课:
namespace SlimDXWithWpf
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
SlimDXRenderer controller;
public MainWindow()
{
InitializeComponent();
controller = new SlimDXRenderer();
controller.Initialize();
D3DImage image = new D3DImage();
image.Lock();
controller.RenderToSurface();
image.SetBackBuffer(D3DResourceType.IDirect3DSurface9, controller.SurfacePointer);
image.AddDirtyRect(new Int32Rect(0, 0, image.PixelWidth, image.PixelHeight));
image.Unlock();
Background = new ImageBrush(image);
}
}
}这是我的“渲染者”课程
namespace SlimDXWithWpf
{
public class SlimDXRenderer : IDisposable
{
Direct3DEx directX;
DeviceEx device;
Surface surface;
Surface backBuffer;
IntPtr surfacePointer;
public IntPtr SurfacePointer
{
get
{
return surfacePointer;
}
}
public void Initialize()
{
directX = new Direct3DEx();
HwndSource hwnd = new HwndSource(0, 0, 0, 0, 0, 640, 480, "SlimDXControl", IntPtr.Zero);
PresentParameters pp = new PresentParameters()
{
BackBufferCount = 1,
BackBufferFormat = Format.A8R8G8B8,
BackBufferWidth = 640,
BackBufferHeight = 480,
DeviceWindowHandle = hwnd.Handle,
PresentationInterval = PresentInterval.Immediate,
Windowed = true,
SwapEffect = SwapEffect.Discard
};
device = new DeviceEx(directX, 0, DeviceType.Hardware, hwnd.Handle, CreateFlags.HardwareVertexProcessing, pp);
backBuffer = device.GetRenderTarget(0);
surface = Surface.CreateRenderTarget(device, 1024, 768, Format.A8R8G8B8, MultisampleType.None, 1, false);
surfacePointer = surface.ComPointer;
}
public void RenderToSurface()
{
device.SetRenderTarget(0, surface);
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, new Color4(Color.Red), 0f, 0);
device.BeginScene();
device.EndScene();
}
public void Dispose()
{
surface.Dispose();
device.Dispose();
directX.Dispose();
}
}
}-编辑:有一秒钟,我以为我已经解决了,但似乎只有当我的第二个渲染目标(我试图清除红色)是640x480时,它才会起作用。有什么想法吗?
发布于 2011-01-13 17:00:26
这些代码是基于SlimDX WPF示例的吗?看起来可能是这样的,这就是为什么清除()调用对Z清除值使用0.0f .这是我们样本中的一个错误。应该是1.0f。
除此之外,我看到的唯一潜在问题是,您的表面渲染目标与后台缓冲区大小不同,但这实际上不应该导致问题。您是否尝试过将其呈现到设备的后台缓冲区(Device.GetBackBuffer()),而不是一个新的表面,以查看它会产生什么影响?
发布于 2011-01-13 11:58:34
在device.Clear调用中,将第一个数值参数从0f更改为1f。这是z深度,范围从0到1。指定z深度为0实际上没有任何效果。
https://stackoverflow.com/questions/4674075
复制相似问题