+ -
当前位置:首页 → 问答吧 → Directx

Directx

时间:2014-03-07

来源:互联网

建立一个Directx环境....两个字...麻烦

最麻烦系一个Direct2D需要一个Device Context
而一个Direct2D Device Context需要一个Direct2D Device
而一个Direct2D Device需要一个DXGI Device
使用一个DXGI Device需要建立Swap Chain, Texture, Buffer, Bitmap
建立Swap Chain需要DXGI Factory
而一个DXGI Device需要一个Direct3D Device

到最后....居然话以上的东西都不能写字...
所以要Print "Hello world"还需要一个DirectWrite Factory
附件 未命名.png (93.87 KB)

2014-2-20 12:15 AM

未命名.png (93.87 KB)

2014-2-20 12:15 AM

作者: Susan﹏汪汪   发布时间: 2014-03-07

唔系佢都唔整个XNA出黎
就好似全部用Win32 API写个GUI程式出黎,所以DX主力都系C++

作者: sinson123   发布时间: 2014-03-07

引用:原帖由 Susan﹏汪汪 於 2014-2-20 12:15 AM 发表
建立一个Directx环境....两个字...麻烦

最麻烦系一个Direct2D需要一个Device Context
而一个Direct2D Device Context需要一个Direct2D Device
而一个Direct2D Device需要一个DXGI Device
使用一个DXGI Device需 ...
我无用过 DirectX 。
其实 SDL + OpenGL ES 是否更好的选择?
上述的我都未用过,不过好像它们都是 cross-platform 的。
http://en.wikipedia.org/wiki/Simple_DirectMedia_Layer
http://en.wikipedia.org/wiki/OpenGL_ES

作者: xianrenb   发布时间: 2014-03-07

引用:原帖由 sinson123 於 2014-2-20 11:43 AM 发表
唔系佢都唔整个XNA出黎
就好似全部用Win32 API写个GUI程式出黎,所以DX主力都系C++
因为directx只可以系以Classic方法去写
有大量的指针操作

不过window 8的话会提供左一些XNA、或者其他的GUI介面系统的handle比directx用

作者: Susan﹏汪汪   发布时间: 2014-03-07

引用:原帖由 xianrenb 於 2014-2-20 01:12 PM 发表


我无用过 DirectX 。
其实 SDL + OpenGL ES 是否更好的选择?
上述的我都未用过,不过好像它们都是 cross-platform 的。
http://en.wikipedia.org/wiki/Simple_DirectMedia_Layer
http://en.wikipedia.org/w ...
SDL应该系已经抽象化的平台
应该唔再需要理用directx定OpenGL

作者: Susan﹏汪汪   发布时间: 2014-03-07

引用:原帖由 xianrenb 於 2014-2-20 01:12 PM 发表


我无用过 DirectX 。
其实 SDL + OpenGL ES 是否更好的选择?
上述的我都未用过,不过好像它们都是 cross-platform 的。
http://en.wikipedia.org/wiki/Simple_DirectMedia_Layer
http://en.wikipedia.org/w ...
以前看过一本 dx 的书, 单是 lib 的每一个function 的 arg 已经几行... 同 win API 有得挥 (烦) ... 如果单是写 game, 一定用 unity 呢 d game engine, 方便快捷, 简单, 仲要 cross platform (ios, android, pc)

作者: bread.doves.   发布时间: 2014-03-07

引用:原帖由 bread.doves. 於 2014-2-21 11:23 PM 发表
以前看过一本 dx 的书, 单是 lib 的每一个function 的 arg 已经几行... 同 win API 有得挥 (烦) ... 如果单是写 game, 一定用 unity 呢 d game engine, 方便快捷, 简单, 仲要 cross platform (ios, android, pc)
系....汪汪写的Directx

这是Device封装
复制内容到剪贴板代码:struct DXDevice
{
D3D_FEATURE_LEVEL featureLevel;
IDXGIDevice1 * pDXGIDevice;
ID2D1Device * pd2dDevice;
ID3D11Device * pd3dDevice;
ID2D1DeviceContext * pd2dDeviceContext;
ID3D11DeviceContext * pd3dDeviceContext;

DXDevice( void );
~DXDevice( void );
};

DXDevice:XDevice( void )
{

UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_9_2,
D3D_FEATURE_LEVEL_9_1
};

HResult( D3D11CreateDevice(
nullptr, // specify null to use the default adapter
D3D_DRIVER_TYPE_HARDWARE,
0,
creationFlags, // optionally set debug and Direct2D compatibility flags
featureLevels, // list of feature levels this app can support
ARRAYSIZE(featureLevels), // number of possible feature levels
D3D11_SDK_VERSION,
&this->pd3dDevice, // returns the Direct3D device created
&this->featureLevel, // returns feature level of device created
&this->pd3dDeviceContext // returns the device immediate context
) );

HResult( this->pd3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&this->pDXGIDevice) );
HResult( D2D1CreateDevice(this->pDXGIDevice, nullptr, &this->pd2dDevice) );
HResult( this->pd2dDevice->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &this->pd2dDeviceContext) );

}

DXDevice::~DXDevice( void )
{
SafeRelease(&this->pd2dDeviceContext);
SafeRelease(&this->pd3dDeviceContext);
SafeRelease(&this->pDXGIDevice);
SafeRelease(&this->pd2dDevice);
SafeRelease(&this->pd3dDevice);
}
这是setup个Directx环境...
复制内容到剪贴板代码:DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
swapChainDesc.Width = 0; // use automatic sizing
swapChainDesc.Height = 0;
swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // this is the most common swapchain format
swapChainDesc.Stereo = false;
swapChainDesc.SampleDesc.Count = 1; // don't use multi-sampling
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 2; // use double buffering to enable flip
swapChainDesc.Scaling = DXGI_SCALING_NONE;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // all apps must use this SwapEffect
swapChainDesc.Flags = 0;

IDXGIAdapter * pDXGIAdapter = nullptr;
HResult( DXDevice.pDXGIDevice->GetAdapter(&pDXGIAdapter) );

IDXGIFactory2 * pDXGIFactory = nullptr;
HResult( pDXGIAdapter->GetParent(__uuidof(IDXGIFactory2), (LPVOID*)&pDXGIFactory) );
SafeRelease(&pDXGIAdapter);

HResult( pDXGIFactory->CreateSwapChainForHwnd(
DXDevice.pd3dDevice,
hWnd,
&swapChainDesc,
nullptr,
nullptr,
&swapChain
) );
SafeRelease(&pDXGIFactory);

HResult( DXDevice.pDXGIDevice->SetMaximumFrameLatency(1) );

D2D1_BITMAP_PROPERTIES1 bitmapProperties = D2D1::BitmapProperties1(
D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,
D2D1:ixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE)
);

IDXGISurface * pDXGIBackBuffer = nullptr;
HResult( swapChain->GetBuffer(0, IID_PPV_ARGS(&pDXGIBackBuffer)) );

ID2D1Bitmap1 * pd2dTargetBitmap = nullptr;
HResult( DXDevice.pd2dDeviceContext->CreateBitmapFromDxgiSurface(
pDXGIBackBuffer,
&bitmapProperties,
&pd2dTargetBitmap
) );
SafeRelease(&pDXGIBackBuffer);

DXDevice.pd2dDeviceContext->SetTarget(pd2dTargetBitmap);
SafeRelease(&pd2dTargetBitmap);

HResult( DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory),
reinterpret_cast<IUnknown**>(&pDWriteFactory)
) );
外部变数有
复制内容到剪贴板代码:DXDevice DXDevice;
IDXGISwapChain1 * swapChain;
IDWriteFactory * pDWriteFactory;
[ 本帖最后由 Susan﹏汪汪 於 2014-2-22 12:37 AM 编辑 ]

作者: Susan﹏汪汪   发布时间: 2014-03-07

已经系尽量删得就删
可以release的就先release掉

轻量版的Direct3D和Direct2D

因为要用Direct2D、所以全部都要用上最新的Directx 11.1 or 11.2
另外还要用window 8的SDK(因为只有window 8 SDK有提供这版本的Directx)

作者: Susan﹏汪汪   发布时间: 2014-03-07

要留意directx 11的header系
d3d11.h和d2d1.h
而directx 11.1的系
d3d11_1.h和d2d1_1.h

两个版本共用
d3d11.lib和d2d1.lib

但directx 11.1里有些功能要用所以一定要追加11.1的header

作者: Susan﹏汪汪   发布时间: 2014-03-07

搞左好多日...终於知道如何更改视窗大细的同时....改个Directx的输出画面大小

作者: Susan﹏汪汪   发布时间: 2014-03-07

作者: Susan﹏汪汪   发布时间: 2014-03-07