我正在尝试使用c ++创建Directx 11程序。在我将 Normal 添加到代码之前,代码已经工作了。现在它根本没有编译着色器。它一直让我访问Violation 0X0000 错误。
我尝试使用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 = 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 文件
ecbuffer ConstantBuffer:register(b0)
{
matrix world;
matrix view;
matrix project;
float3[2] LightDir;
float4[2] LightColor;
}
struct Vout{
float4 pos:SV_POSITION;
float4 normal : NORMAL;
};
Vout VS(float3 pos:POSITION,float3 Norm:NORMAL)
{
Vout vo = (Vout)0;
vo.pos = mul(float4(pos,1),world);
vo.pos = mul(vo.pos,view);
vo.pos = mul(vo.pos,project);
vo.normal = mul(float4(Norm,1),world);
return vo;
}
float4 PS(float4 pos:SV_POSITION,float4 normal:NORMAL):SV_TARGET
{
float4 col;
for(int i=0; i < 2;++i)
{
col += saturate(dot(normal,LightDir[i])) * LightColor[i] ;
}
return col;
}
任何人请能够帮助我......
如果可能请解释为什么会一直发生总是 ..我在这里做错了什么
请帮帮我。我迫切需要解决这个问题....
谢谢...
答案 0 :(得分:0)
虽然在运行时编译HLSL对于学习和迭代很有用,但通过使用命令行编译HLSL实际上要容易得多:
fxc test.fx /Tvs_4_0 /EVS
和fxc test.fx /Tps_4_0 /EPS
第二个失败是因为您未能在Pixel Shader中设置col的初始值:
test.fx(40,25-47):警告X3206:'dot':向量类型的隐式截断
test.fx(40,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;
}
您正在获取AV,因为您对失败的编译器输出的处理错误,您忘记将BErrorVS
和BErrorPS
初始化为null,并且您尝试输出BErrorVS
当VS成功,但PS失败了。它应该是:
if(FAILED(hr))
{
printf("Error %08X %5s\n",hr,(char*)BErrorPS->GetBufferPointer());
MessageBox(hwnd,L"Pixel shader not created ",L"",0);
}
此外,您应该记住BErrorVS
和BErrorPS
即使SUCCEEDED(hr))
也可以设置为非空值,因为它只能报告非致命警告。