繁体   English   中英

C ++中的着色器和Directx11编译

[英]Shaders and Directx11 compilation in c++

我正在尝试使用c ++创建Directx 11程序。 在我将Normal添加到代码之前,该代码曾经可以工作。现在它根本不编译着色器。它始终为我提供访问Violation 0X0000 Error的权限。

我尝试使用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;
 }

任何人都可以客气帮助我...

如果可能的话,请你解释为什么一直都在发生..What我做错了这里

请帮助我。我迫切需要解决这个问题。

谢谢...

虽然在运行时编译HLSL是学习和迭代不错,它实际上是一个更容易通过使用命令行编译它来调试HLSL:

fxc test.fx /Tvs_4_0 /EVSfxc test.fx /Tps_4_0 /EPS

因为你没有设置初始值在像素着色器山坳第二个失败:

test.fx(40,25-47):警告X3206:“点”:向量类型的隐式截断

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,因为你有错误处理失败的编译器输出的,你忘了来初始化BErrorVSBErrorPS为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);

}

你应该还记得BErrorVSBErrorPS可以设置为一个非空值,即使SUCCEEDED(hr))因为它可以仅报告非致命警告。

HLSL,FXC和D3DCompile

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM