我正在使用以下代码调用D3D11CreateDevice():
ID3D11Device* md3dDevice;
ID3D11DeviceContext* md3dImmediateContext;
D3D_DRIVER_TYPE md3dDriverType = D3D_DRIVER_TYPE_HARDWARE;
createDeviceFlags = D3D11_CREATE_DEVICE_DEBUG;
HRESULT hr = D3D11CreateDevice(
0,
md3dDriverType,
0,
createDeviceFlags,
0, 0,
D3D11_SDK_VERSION,
&md3dDevice,
&featureLevel,
&md3dImmediateContext);
Run Code Online (Sandbox Code Playgroud)
但是,存储的结果HRESTUL hr
是E_FAIL
.控制台具有以下输出:
Init Direct3D.exe中0x7590b9bc的第一次机会异常:Microsoft
C++异常:内存位置为0x0049ec64的_com_error ..
c:\ users\andrew\desktop\code\common\d3dapp.cpp(389):
D3D11CreateDevice(0,md3dDriverType,0 ,createDeviceFlags,0,0,D3D11_SDK_VERSION,&md3dDevice,&featureLevel,&md3dImmediateContext)
hr = E_FAIL(0x80004005)Init Direct3D.exe触发了断点
我不认为它是代码构建时的链接问题,但定义了以下附加依赖项:
d3d11lib
d3dx11d.lib
D3DCompiler.lib
Effects11d.lib
dxerr.lib
我的下一个想法是我的卡与D3D11不兼容.然而,这种情况并非如此.这是输出dxdiag
:
------------------
System Information
------------------
Time of this report: 5/14/2012, 02:29:16
Machine name: WINDOZE
Operating System: Windows 7 Professional 64-bit (6.1, Build 7601) Service Pack 1 (7601.win7sp1_gdr.120330-1504)
Language: …
Run Code Online (Sandbox Code Playgroud) 使用此代码我可以将一个纹理发送到着色器:
devcon->PSSetShaderResources(0, 1, &pTexture);
Run Code Online (Sandbox Code Playgroud)
当然我通过以下方式制作了pTexture:D3DX11CreateShaderResourceViewFromFile
着色器:Texture2D纹理;
return color * Texture.Sample(ss, texcoord);
Run Code Online (Sandbox Code Playgroud)
我目前只向着色器发送一个纹理,但我想发送多个纹理,这怎么可能?
谢谢.
我是DirectX的新手,并尝试使用SharpDX使用Desktop Duplication API捕获屏幕截图.
我想知道是否有任何简单的方法来创建我可以在CPU中使用的位图(即保存在文件等)
我使用以下代码获取桌面屏幕截图:
var factory = new SharpDX.DXGI.Factory1();
var adapter = factory.Adapters1[0];
var output = adapter.Outputs[0];
var device = new SharpDX.Direct3D11.Device(SharpDX.Direct3D.DriverType.Hardware,
DeviceCreationFlags.BgraSupport |
DeviceCreationFlags.Debug);
var dev1 = device.QueryInterface<SharpDX.DXGI.Device1>();
var output1 = output.QueryInterface<Output1>();
var duplication = output1.DuplicateOutput(dev1);
OutputDuplicateFrameInformation frameInfo;
SharpDX.DXGI.Resource desktopResource;
duplication.AcquireNextFrame(50, out frameInfo, out desktopResource);
var desktopSurface = desktopResource.QueryInterface<Surface>();
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我一些关于如何从desktopSurface(DXGI.Surface实例)创建位图对象的想法?
我最近一直在使用计算着色器,我正在尝试确定设置[numthreads(x,y,z)]和调度调用的最佳方法.我的演示窗口是800x600,我每像素启动1个线程.我正在进行2D纹理修改 - 没有太重.
我的第一次尝试是指定
[numthreads(32,32,1)]
Run Code Online (Sandbox Code Playgroud)
我的Dispatch()调用总是如此
Dispatch(ceil(screenWidth/numThreads.x),ceil(screenHeight/numThreads.y),1)
Run Code Online (Sandbox Code Playgroud)
因此,对于第一个实例
Dispatch(25,19,1)
Run Code Online (Sandbox Code Playgroud)
这个速度为25-26 fps.然后我减少到[numthreads(4,4,1)],运行速度为16 fps.将它增加到[numthreads(16,16,1)]开始了大约30 fps的良好结果.使用Y线程组编号[numthreads(16,8,1)]进行操作,设法将其推送到32 fps.
我的问题是有没有一种最佳的方法来确定线程数,这样我可以最有效地利用GPU,或者只是好的试验和错误?
是否可以使用默认的.net绘制方法(System.Drawing方法)绘制到SharpDX Texture2D对象的东西,以便我可以将其显示为纹理?最好使用SharpDX Toolkit.
如果有,怎么样?
编辑:我到目前为止所尝试的内容:
Bitmap b = new Bitmap(100,100);
MemoryStream ms = new MemoryStream();
b.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
Texture2D tex = Texture2D.Load(g.device, ms); // crashing here
ms.Close();
Run Code Online (Sandbox Code Playgroud) 我正在我的游戏引擎中使用自动OpenGL批处理方法,以减少绘制调用和冗余调用.
我的批处理树设计从最昂贵的状态开始,并为每个较便宜的状态添加叶子.
示例:树根:着色器/程序兄弟:混合状态... aso
所以我的问题是这个列表中最有可能是最昂贵的电话:
还想知道哪种方法会更快:
- 将所有可处理的绘制命令收集到单个顶点缓冲区并仅调用1个绘制调用(此方法也会强制更新cpu侧每个顶点的矩阵变换)
- 不要批处理并渲染很多小绘制调用,只有批处理粒子系统......
PS:渲染目标将始终更改为Pre或Post,具体取决于使用情况.
迄今取得的进展:
1:帧缓冲状态
2:程序
3:纹理绑定
...
N:顶点数组绑定,统一绑定
WebGL中的当前执行树:
每个步骤都是一个兄弟哈希树,以避免再次检查主渲染队列中的状态缓存
加载纹理/程序/着色器/缓冲区在渲染到额外队列之前发生,以便将来进行多线程处理,并确保在对其执行任何操作之前初始化上下文.
自渲染对象的最大问题是你无法控制什么时候发生的事情,例如如果开发人员在gl初始化之前调用这些方法,他就不知道为什么会有一些错误或问题...
我有用C++编写的DirectX11 Engine,带有CLR的C++包装器和C#中的接口.
1)我很好奇这个结构中的瓶颈在哪里,我想知道是否有更有效的方法让我在WinForms控件中托管DirectX11渲染.
2)有没有办法在WinForms控件的所有者以外的线程上呈现?我怀疑它,但我想问.
3)有没有办法渲染多个帧而不通过每个帧上的包装层但保持应用程序响应?
我已经将这个设置与SlimDX进行了比较,实际上只是清除屏幕并且没有进行任何其他API调用时,FPS稍微变慢了.SlimDX~3000 FPS,我的引擎~2000 FPS.这不是什么大问题,但我想知道这33%的差异来自哪里,因为它可能会在以后比较20 fps到30时产生影响.
我将介绍当前的设置并尽可能多地描述.我相信一路上人们会要求更多信息,我会根据需要更新.
我的WinForms GraphicsPanel控件如下.它将系统消息传递给包装层.
public class GraphicsPanel : Control
{
EngineWrapper Engine;
public GraphicsPanel()
{
this.SetStyle(ControlStyles.Selectable, true);
this.SetStyle(ControlStyles.UserMouse, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.TabStop = true;
}
public void SetEngine(EngineWrapper Engine)
{
this.Engine = Engine;
Application.Idle += OnApplicationIdle;
}
~GraphicsPanel()
{
System.Windows.Forms.Application.Idle -= OnApplicationIdle;
}
void PassMessage(Message m)
{
Engine.ProcessWindowMessage(m.Msg, m.WParam, m.LParam);
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
PassMessage(m);
}
private void OnApplicationIdle(object sender, EventArgs …
Run Code Online (Sandbox Code Playgroud) 我只是偶然发现了这个令人烦恼的行为,同时在示例程序上添加了全屏支持.
创建一个全屏窗口可以工作,但只要我在包含我的全屏窗口的输出上移动任何窗口(从另一个应用程序),它就会自动切换回窗口.
有没有办法防止这种行为(所以全屏窗口不会回到窗口)?
作为参考,这是一个小的独立示例(因此可以轻松复制问题).
如果这很有用,我也在Windows 8.1上运行.
我已经尝试更改WindowAssociationFlags和SwapChainFlags,两者都没有成功,与使用FlipSequential而不是Discard相同
SharpDX.DXGI.Factory2 factory = new SharpDX.DXGI.Factory2();
SharpDX.DXGI.Adapter adapter = factory.GetAdapter(0);
var renderForm1 = new RenderForm("Form 1");
factory.MakeWindowAssociation(renderForm1.Handle, SharpDX.DXGI.WindowAssociationFlags.IgnoreAll);
Device device = new Device(adapter, DeviceCreationFlags.BgraSupport);
SharpDX.DXGI.SwapChainDescription sd = new SharpDX.DXGI.SwapChainDescription()
{
BufferCount = 2,
ModeDescription = new SharpDX.DXGI.ModeDescription(0, 0, new SharpDX.DXGI.Rational(50, 1), SharpDX.DXGI.Format.R8G8B8A8_UNorm),
IsWindowed = true,
OutputHandle = renderForm1.Handle,
SampleDescription = new SharpDX.DXGI.SampleDescription(1,0),
SwapEffect = SharpDX.DXGI.SwapEffect.Discard,
Usage = SharpDX.DXGI.Usage.RenderTargetOutput,
Flags = SharpDX.DXGI.SwapChainFlags.None
};
var swapChain1 = new SharpDX.DXGI.SwapChain(factory, device, sd);
renderForm1.Left = 1922; //Just hardcoded …
Run Code Online (Sandbox Code Playgroud) 我正在使用桌面复制API(DirectX11)捕获屏幕.DuplicateOutput API返回访问被拒绝的错误,并且在登录屏幕上的Windows 8.1计算机上发生的情况非常罕见(可能是10%),尽管我的应用程序正在以SYSTEM级别权限运行并正确调用SetThreadDesktop.我曾经在我收到的每一个错误之后重置并调用SetThreadDesktop,但是即使在多个设备重置和启动之后,应用程序也无法从错误中恢复.在多次重试或重新启动应用程序后,我不得不回退到GDI(应用程序在从directx切换到GDI之后工作正常),但这个想法似乎很糟糕.
注意:我确实在Windows 10/Windows 8计算机上遇到了同样的问题,但与特定的Windows 8.1计算机相比并不常见.
这里是E_ACCESSDENIED错误的描述,该错误仅告知此错误可能的情况(没有系统级权限或SetThreadDesktop未被正确调用).我尝试了所有可能的方法来找出问题,但不能.
任何帮助将不胜感激,提前致谢.
以下是初始化设备的代码:
//
// Initialize duplication interfaces
//
HRESULT cDuplicationManager::InitDupl(_In_ ID3D11Device* Device, _In_ IDXGIAdapter *_pAdapter, _In_ IDXGIOutput *_pOutput, _In_ UINT Output)
{
HRESULT hr = E_FAIL;
if(!_pOutput || !_pAdapter || !Device)
{
return hr;
}
m_OutputNumber = Output;
// Take a reference on the device
m_Device = Device;
m_Device->AddRef();
_pOutput->GetDesc(&m_OutputDesc);
// QI for Output 1
IDXGIOutput1* DxgiOutput1 = nullptr;
hr = _pOutput->QueryInterface(__uuidof(DxgiOutput1), reinterpret_cast<void**>(&DxgiOutput1));
if (FAILED(hr))
{
return ProcessFailure(nullptr, _T("Failed to QI …
Run Code Online (Sandbox Code Playgroud) screen-capture directx-11 visual-c++ dxgi desktop-duplication
我正在使用 DirectX 来绘制视频。通过Intel Media SDK解码后。然后我通过以下英特尔代码绘制它:
mfxStatus CD3D11Device::RenderFrame(mfxFrameSurface1 * pSrf, mfxFrameAllocator * pAlloc)
{
HRESULT hres = S_OK;
mfxStatus sts;
sts = CreateVideoProcessor(pSrf);
MSDK_CHECK_STATUS(sts, "CreateVideoProcessor failed");
hres = m_pSwapChain->GetBuffer(0, __uuidof( ID3D11Texture2D ), (void**)&m_pDXGIBackBuffer.p);
if (FAILED(hres))
return MFX_ERR_DEVICE_FAILED;
D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC OutputViewDesc;
if (2 == m_nViews)
{
m_pVideoContext->VideoProcessorSetStreamStereoFormat(m_pVideoProcessor, 0, TRUE,D3D11_VIDEO_PROCESSOR_STEREO_FORMAT_SEPARATE,
TRUE, TRUE, D3D11_VIDEO_PROCESSOR_STEREO_FLIP_NONE, NULL);
m_pVideoContext->VideoProcessorSetOutputStereoMode(m_pVideoProcessor,TRUE);
OutputViewDesc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2DARRAY;
OutputViewDesc.Texture2DArray.ArraySize = 2;
OutputViewDesc.Texture2DArray.MipSlice = 0;
OutputViewDesc.Texture2DArray.FirstArraySlice = 0;
}
else
{
OutputViewDesc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D;
OutputViewDesc.Texture2D.MipSlice = 0;
}
if (1 == m_nViews || 0 == …
Run Code Online (Sandbox Code Playgroud)