C++中的着色器和DIXTX11编译 我试图用C++来创建DirectX 11程序。在我将法线添加到代码之前,该代码曾经正常工作。现在它根本不编译着色器。它一直给我访问冲突0X0000错误
我尝试使用d3dErrorBlolb,但没有太大帮助。问题似乎在于代码的这一部分C++中的着色器和DIXTX11编译 我试图用C++来创建DirectX 11程序。在我将法线添加到代码之前,该代码曾经正常工作。现在它根本不编译着色器。它一直给我访问冲突0X0000错误,c++,compilation,directx,shader,directx-11,C++,Compilation,Directx,Shader,Directx 11,我尝试使用d3dErrorBlolb,但没有太大帮助。问题似乎在于代码的这一部分 void InitPipeline(HWND hwnd) { ID3D10Blob * BVS = 0,*BPS = 0; ID3D10Blob * BErrorVS,*BErrorPs; HRESULT hr1 = D3DX11CompileFromFile(L"Test.fx",0,0,"VS","vs_4_0",0,0,0,&BVS,&BErrorVS,0); HRESULT hr =
void InitPipeline(HWND hwnd)
{
ID3D10Blob * BVS = 0,*BPS = 0;
ID3D10Blob * BErrorVS,*BErrorPs;
HRESULT hr1 = D3DX11CompileFromFile(L"Test.fx",0,0,"VS","vs_4_0",0,0,0,&BVS,&BErrorVS,0);
HRESULT hr = D3DX11CompileFromFile(L"Test.fx",0,0,"PS","ps_4_0",0,0,0,&BPS,&BErrorPs,0);
if(FAILED(hr))
{
printf("Error %08X %5s\n",hr,(char*)BErrorVS);
MessageBox(hwnd,L"Pixel shader not created ",L"",0);
}
if(FAILED(hr1))
{ MessageBox(hwnd,L"Vertex shader not created ",L"",0);}
dev->CreateVertexShader(BVS->GetBufferPointer(),BVS->GetBufferSize(),0,&BoxVShader);
dev->CreatePixelShader(BPS->GetBufferPointer(),BPS->GetBufferSize(),0,&BoxPixelShader);
// create the input layout object
D3D11_INPUT_ELEMENT_DESC ied[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"NORMAL",0,DXGI_FORMAT_R32G32B32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0}
// {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0}
};
//SecureZeroMemory(&Bin);
dev->CreateInputLayout(ied,2,BVS->GetBufferPointer(),BVS->GetBufferSize(),&BInputLayout);
devcon->VSSetShader(BoxVShader,0,0);
devcon->PSSetShader(BoxPixelShader,0,0);
devcon->IASetInputLayout(BInputLayout);
}
Test.fx文件
谁能帮我一下吗
如果可能的话,请解释为什么这种情况总是发生1.我做错了什么
请帮帮我。我迫切需要解决这个问题
谢谢…虽然在运行时编译HLSL对于学习和迭代来说很好,但通过使用命令行编译HLSL,实际上调试HLSL要容易得多: fxc test.fx/Tvs_4_0/EVS和fxc test.fx/Tps_4_0/EPS 第二个失败,因为您未能在像素着色器中设置col的初始值: test.fx40,25-47:警告X3206:“点”:向量类型的隐式截断 test.fx40,9-64:错误X4000:未完全初始化就使用了变量“col” 编译失败;没有生成代码 解决方法很简单:
float4 PS(float4 pos:SV_POSITION,float4 normal:NORMAL):SV_TARGET
{
float4 col = 0;
for(int i=0; i < 2;++i)
{
col += saturate(dot(normal,LightDir[i])) * LightColor[i] ;
}
return col;
}
此外,您应该记住,即使SucceedHr,BErrorVS和BErrorPS也可以设置为非空值,因为它只能报告非致命警告
看我帮不了什么忙,但我找到了这个东西:最后哇,谢谢你的时间……我真的很感激……谢谢,我会调查的。。。。谢谢谢谢谢谢…你能告诉我命令行的位置吗,这样我就可以用它来调试它了…再次感谢如果你有VS 2012,请寻找VS2012的开发者命令提示符。使用VS2013,查找包含开发人员命令提示符项的Visual Studio工具文件夹。如果您使用的是旧版DirectX SDK,请查找DirectX SDK命令提示符。您还可以将其添加为VS的MSBuild生成系统中的自定义生成步骤,或添加为.fx文件的自定义生成规则。这两种方法都允许您通过访问VS环境变量集来输入任意命令行指令。对于VS 2012和2013,有一个使用FXC的.fx/.hlsl文件的内置处理程序。主要问题是,MSBuild采用单一源文件->单一结果文件,这只适用于旧的fx_uu配置文件。对于其他用途,通常使用不同的参数多次编译同一文件。使用MSBuild模拟这种情况的唯一方法是为每个目标创建一个文件,并大量使用include。最后,除了一些琐碎的情况外,在批处理文件中使用命令行通常要容易得多。例如,请参见。您好,谢谢大家的帮助。但是我似乎无法从DirecxSDK commandprompt编译文件。我设置了目录usinf cd Path,然后当我使用fxc Test.hlsl/Tvs_4_0/EVS时,它会显示一个红色的错误,表示它从程序开始就存在。您知道为什么会发生这种情况吗
float4 PS(float4 pos:SV_POSITION,float4 normal:NORMAL):SV_TARGET
{
float4 col = 0;
for(int i=0; i < 2;++i)
{
col += saturate(dot(normal,LightDir[i])) * LightColor[i] ;
}
return col;
}
if(FAILED(hr))
{
printf("Error %08X %5s\n",hr,(char*)BErrorPS->GetBufferPointer());
MessageBox(hwnd,L"Pixel shader not created ",L"",0);
}