所以我按照书上的说明创建了一个d3d对象。但是,当我尝试编译代码时,它在d3d11shader.h中给了我一些奇怪的错误。
在d3dshader.h中,
#include "d3dcommon.h"
//other stuff
typedef struct _D3D11_SIGNATURE_PARAMETER_DESC
{
LPCSTR SemanticName;
UINT SemanticIndex;
UINT Register;
D3D_NAME SystemValueType;
D3D_REGISTER_COMPONENT_TYPE ComponentType;
BYTE Mask;
BYTE ReadWriteMask;
UINT Stream;
D3D_MIN_PRECISION MinPrecision; //Errors here
} D3D11_SIGNATURE_PARAMETER_DESC;
详情:
(1) Error 29 error C2146: syntax error : missing ';' before identifier 'MinPrecision' c:\program files (x86)\windows kits\8.0\include\um\d3d11shader.h 54
(2) Error 30 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\program files (x86)\windows kits\8.0\include\um\d3d11shader.h 54
这很奇怪,因为d3dcommon.h和d3d11shader.h文件都是在Windows SDK和DirectX SDK中定义的,因此我无法更改其中的任何内容。谁能告诉我如何解决它?这里有任何意见。
以下是我的Source.cpp中的代码,这些代码直接从Frank Luna的3D Game Programming with DirectX11中复制。
#include "d3dApp.h"//This header file is provided by the book
class InitDirect3DApp : public D3DApp
{
public:
InitDirect3DApp(HINSTANCE hInstance);
~InitDirect3DApp();
bool Init();
void OnResize();
void UpdateScene(float dt);
void DrawScene();
};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance,
PSTR cmdLine, int showCmd)
{
// Enable run-time memory check for debug builds.
#if defined(DEBUG) | defined(_DEBUG)
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
InitDirect3DApp theApp(hInstance);
if( !theApp.Init() )
return 0;
return theApp.Run();
}
Init Direct3DApp::InitDirect3DApp(HINSTANCE hInstance)
: D3DApp(hInstance)
{
}
InitDirect3DApp::~InitDirect3DApp()
{
}
bool InitDirect3DApp::Init()
{
if(!D3DApp::Init())
return false;
return true;
}
void InitDirect3DApp::OnResize()
{
D3DApp::OnResize();
}
void InitDirect3DApp::UpdateScene(float dt)
{
}
void InitDirect3DApp::DrawScene()
{
assert(md3dImmediateContext);
assert(mSwapChain);
md3dImmediateContext->ClearRenderTargetView(mRenderTargetView, reinterpret_cast<const float*>(&Colors::Blue));
md3dImmediateContext->ClearDepthStencilView(mDepthStencilView, D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL, 1.0f, 0);
HR(mSwapChain->Present(0, 0));
}
我注意到的另一个奇怪的事情是,有时当我转到D3D_MIN_PRECISION的定义并将它指向d3dcommon.h时,d3dcommon.h中的代码根本没有突出显示。 Visual Studio会自动对所有其他文件进行突出显示,但不会对此进行突出显示。所以我只是假设它无法识别此特定头文件中的代码...
另外,当我刚刚尝试编译代码时,除了前两个之外还会出现另一个错误:
31 IntelliSense: identifier "D3D_MIN_PRECISION" is undefined c:\Program Files (x86)\Windows Kits\8.0\Include\um\d3d11shader.h 54
仅供参考,我在Windows 8.1机器上使用vs2012。非常感谢!
答案 0 :(得分:0)
您的问题很可能是您错误地混合了Windows 8.x SDK和旧版DirectX SDK标头。
以前,您会设置INCLUDE和LIB路径,以便DXSDK_DIR是第一个,但只有当DirectX SDK标头是最新的时才有效。现在它们已经过时了,你需要在DXSDK_DIR之前使用WindowsSdkDir(假设你需要使用D3DX之类的东西,这种东西已被弃用,仅在传统的DirectX SDK中可用;否则根本不需要它。) / p>
使用VS 2012的“v110”或VS 2013的“v120”平台工具集,如果您还需要使用DirectX SDK,则可以使用包含和库的VC ++目录设置:
$(IncludePath);$(DXSDK_DIR)Include
$(LibraryPath);$(DXSDK_DIR)Lib\<x86 or x64>
请参阅MSDN,Living Without D3DX,XInput和XAudio
顺便说一下,如果您尝试使用VS 2012的“v110_xp”或VS 2013的“v120_xp”平台工具集,它的工作方式与过去相似,并会使用传统的顺序。请参阅this博文。$(DXSDK_DIR)Include;$(IncludePath);
$(DXSDK_DIR)Lib\<x86 or x64>;$(LibraryPath)