首先处理着色器。最初对DirectX教程感到困惑 我遵循DirectX教程,对Visual C++ 2010的C++知识知之甚少。到目前为止,我知道的足够多,可以了解/理解所有内容,但现在我正在尝试包括一个HLSL着色器。我有我需要的内容,但我不知道HLSL需要什么样的文件。文件是否需要采用某种格式?我曾尝试将着色器代码放入.cpp文件,但在使用CreateVertexShader函数时遇到访问冲突。我把它放在头文件中,但是它读取了像C++一样的HLSL代码并得到语法错误。教程如下:

首先处理着色器。最初对DirectX教程感到困惑 我遵循DirectX教程,对Visual C++ 2010的C++知识知之甚少。到目前为止,我知道的足够多,可以了解/理解所有内容,但现在我正在尝试包括一个HLSL着色器。我有我需要的内容,但我不知道HLSL需要什么样的文件。文件是否需要采用某种格式?我曾尝试将着色器代码放入.cpp文件,但在使用CreateVertexShader函数时遇到访问冲突。我把它放在头文件中,但是它读取了像C++一样的HLSL代码并得到语法错误。教程如下:,directx,shader,hlsl,directx-11,Directx,Shader,Hlsl,Directx 11,页面底部代码中的代码是相同的,它可以编译,但在调试过程中会遇到访问冲突。有人能告诉我需要做什么才能让它正常运行吗 谢谢。那个网站很糟糕,因为它根本没有任何错误检查。必须检查返回HRESULT的每个directX调用是否有错误。如果返回S_OK,则一切正常。检查文档并确保检查每个directX返回值 您的着色器可能有错误并且无法编译,因此您可能会将空指针传递给CreateVertexShader 以下是我检查错误的方法: 首先把它放在某个地方(你不需要所有这些include和lib,但我不确定这是

页面底部代码中的代码是相同的,它可以编译,但在调试过程中会遇到访问冲突。有人能告诉我需要做什么才能让它正常运行吗


谢谢。

那个网站很糟糕,因为它根本没有任何错误检查。必须检查返回HRESULT的每个directX调用是否有错误。如果返回S_OK,则一切正常。检查文档并确保检查每个directX返回值

您的着色器可能有错误并且无法编译,因此您可能会将空指针传递给CreateVertexShader

以下是我检查错误的方法:

首先把它放在某个地方(你不需要所有这些include和lib,但我不确定这是必须的):

请注意结尾处的“HR(“在Begging,显然是另一个”)”。如果此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;
}
ID3D10Blob*shaderBlob=NULL;
ID3D10Blob*errorBlob=NULL;
HR(D3DX11CompileFromFileA(fileName.c_str(),宏,NULL,mainFunction.c_str(),shaderModel.c_str(),和,
shaderCompileFlags,0,NULL,&shaderBlob,&errorBlob,NULL));
if(errorBlob)
{
char*es=reinterpret_cast(errorBlob->GetBufferPointer());
NXMsg(“ERROR”,es);//显示错误消息框
errorBlob->Release();
返回NULL;
}
带有HLSL代码的文件的格式并不重要。通常人们会选择像.hlsl、.vs(顶点着色器)、.ps(像素着色器)之类的东西

HR(device->CreateVertexShader(shaderBlob->GetBufferPointer(),shaderBlob->GetBufferSize(),NULL,&vs));
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;
}