2011-07-23 44 views
0

我在Visual C++ 2010中很少了解C++的DirectX教程。我知道足够了解/了解到目前为止的所有内容,但现在我试图包含HLSL着色器。我有我需要的内容,但我不知道HLSL需要什么类型的文件。有没有文件需要的格式?我曾尝试将着色器代码放在一个.cpp文件中,但当我使用CreateVertexShader函数时,我得到了一个访问冲突。我把它放在一个头文件中,但是它读取了像C++这样的HLSL代码,并且出现了语法错误。本教程位于:http://www.directxtutorial.com/Tutorial11/B-A/BA5.aspx首先处理着色器。最初与DirectX教程混淆

页面底部的代码中的代码是相同的,并且它会进行编译,但在调试过程中会出现访问冲突。任何人都可以告诉我我需要做什么才能正常运行?

谢谢。

回答

1

该网站是非常糟糕的,因为它根本没有任何错误检查。每个directX调用返回HRESULT 必须检查错误。如果它返回S_OK,一切都可以。检查文档,并确保您检查EVERY directX返回值。

您的着色器可能有错误,并且无法编译,所以您可能会传递一个指向CreateVertexShader的NULL指针。

这是我如何检查错误:

首先把这个地方(你并不需要所有这些包括与此库,但我不知道这是一个必须为这个工作) :现在

#include <D3D11.h> 
#include <DXGI.h> 
#include <DxErr.h> 
#include <D3D11Shader.h> 
#include <D3Dcompiler.h> 
#include <D3DX11async.h> 

#if defined(_DEBUG) 
#pragma comment(lib,"d3dx11d.lib") 
#else 
#pragma comment(lib,"d3dx11.lib") 
#endif 

#pragma comment(lib,"d3d11.lib") 
#pragma comment(lib,"dxgi.lib") 
#pragma comment(lib,"DxErr.lib") 
#pragma comment(lib,"d3dcompiler.lib") 

    #ifndef HR 
     #define HR(x){HRESULT hr=x;if(FAILED(hr)){DXTraceW(__FILE__,(DWORD)__LINE__,hr,L#x,true);TRUE;}} 
    #endif 

,对每一位的DirectX调用返回HRESULT(所有Create *来电或compile_shader_from_file调用),这样做:

HR(device->CreateVertexShader(shaderBlob->GetBufferPointer(),shaderBlob->GetBufferSize(),NULL,&vs)); 

注意 “HR(” 在beggining和ob另一个“)”在最后。如果此directX呼叫失败,您将收到错误消息。

对于着色器来说,你必须获得更多的数据来看看你在编写HLSL代码时真正搞砸了什么。下面是我如何做到这一点:

ID3D10Blob* shaderBlob=NULL; 
ID3D10Blob* errorBlob=NULL; 

HR(D3DX11CompileFromFileA(fileName.c_str(),macros,NULL,mainFunction.c_str(),shaderModel.c_str(), 
    shaderCompileFlags,0,NULL,&shaderBlob,&errorBlob,NULL)); 

if(errorBlob) 
{ 
    char* es=reinterpret_cast<char*>(errorBlob->GetBufferPointer()); 
     NXMsg("ERROR",es);// Shows error message box 
    errorBlob->Release(); 
    return NULL; 
} 

的文件与HLSL代码的格式并不重要。通常人们选择类似.hlsl,.vs(顶点着色器),.ps(像素着色器)或其他。