创建顶点着色器时需要帮助了解无效的参数错误

时间:2013-06-22 02:51:02

标签: c++ directx directx-11

我刚开始使用DirectX 11,我遇到了一个问题。我正在HSDL文件中加载一个非常简单的着色器:

struct VOut{
float4 position : SV_POSITION;
float4 color : COLOR;
};

VOut VS_Main( float4 pos : POSITION, float4 color : COLOR )
{
VOut output;

output.position = pos;
output.color = color;

return output;
}


float4 PS_Main( float4 pos : SV_POSITION, float4 color : COLOR ) : SV_TARGET
{
return color;
}

使用以下代码(不会触发if(FAILED(结果)语句):

bool PathfindingDemoBase::CompileD3DShader(char* filePath, char* entry, char* shaderModel, ID3DBlob** buffer){
DWORD shaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;

#if defined(DEBUG) || defined(_DEBUG)
shaderFlags |= D3DCOMPILE_DEBUG;
#endif

ID3DBlob* errorBuffer = 0;
HRESULT result;

result = D3DX11CompileFromFile(filePath, 0, 0, entry, shaderModel,
    0, 0, 0, buffer, &errorBuffer, 0);

if(FAILED(result)){
    if(errorBuffer != 0){
        OutputDebugStringA((char*)errorBuffer->GetBufferPointer());
        errorBuffer->Release();
    }

    return false;
}

if(errorBuffer != 0){
    errorBuffer->Release();
}

return true;
}

但是在LoadContent函数中发生了什么,注释行(//< ---)触发了一个“E_INVALIDARG”结果(在d3dResult中),但是vsBuffer->调用没有返回null:/

bool AStarDemo::LoadContent(){
ID3D10Blob* vsBuffer = 0;
bool compileResult = CompileD3DShader("ReturnColor.hlsl", "VS_Main", "vs_5_0", &vsBuffer);

if(compileResult == false){
    MessageBox(0, "Error loading vertex shader!", "Compile Error", MB_OK);
    return false;
}

HRESULT d3dResult;

d3dResult = d3dDevice->CreateVertexShader(vsBuffer->GetBufferPointer(),
    vsBuffer->GetBufferSize(), 0, &returnColorVS);
//actually set the vertex shader
d3dContext->VSSetShader(returnColorVS, 0, 0);

if(FAILED(d3dResult)){
    if(vsBuffer){
        vsBuffer->Release();
    }

    return false;
}

D3D11_INPUT_ELEMENT_DESC solidColorLayout[] ={
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};

unsigned int totalLayoutElements = ARRAYSIZE(solidColorLayout);

d3dResult = d3dDevice->CreateInputLayout(solidColorLayout, totalLayoutElements,
    vsBuffer->GetBufferPointer(), vsBuffer->GetBufferSize(), &inputLayout);

vsBuffer->Release();

if(FAILED(d3dResult)){
    return false;
}

ID3D10Blob* psBuffer = 0;
compileResult = CompileD3DShader("ReturnColor.hlsl", "PS_Main", "ps_5_0", &psBuffer);
//actually set the pixel shader
d3dContext->PSSetShader(returnColorPS, 0, 0);

if(compileResult == false){
    MessageBox(0, "Error loading pixel shader!", "Compile Error", MB_OK);
    return false;
}

d3dResult = d3dDevice->CreatePixelShader(psBuffer->GetBufferPointer(),
    psBuffer->GetBufferSize(), 0, &returnColorPS);

psBuffer->Release();

if(FAILED(d3dResult)){
    return false;
}

Vertex vertices[4 * TOTAL_NUMBER_GRID_SQUARES];
gridSquares = new GridSquare[TOTAL_NUMBER_GRID_SQUARES];
//for each grid square
for(int i = 0; i < TOTAL_NUMBER_GRID_SQUARES; i++){

    XMFLOAT4 color = ((i%2) == 0) ? GREEN : RED;

    //create a grid square object
    GridSquare gs;
    gs.TopLeft = Vertex( XMFLOAT3(0.5f * i,  0.5f * i, Z_LEVEL),
                        color);
    gs.TopRight = Vertex( XMFLOAT3( 0.5f * i, -0.5f * i, Z_LEVEL),
                        color);
    gs.BottomRight = Vertex( XMFLOAT3(-0.5f * i, -0.5f * i, Z_LEVEL),
                        color);
    gs.BottomLeft = Vertex( XMFLOAT3(-0.5f * i,  0.5f * i, Z_LEVEL),
                        color);

    gs.type = ((i%2) == 0) ? prey : hunter;

    gridSquares[i] = gs;

    vertices[4*i] = gs.TopLeft;
    vertices[(4*i)+1] = gs.TopRight;
    vertices[(4*i)+2] = gs.BottomRight;
    vertices[(4*i)+3] = gs.BottomLeft;
}

D3D11_BUFFER_DESC vertexDesc;
ZeroMemory(&vertexDesc, sizeof(vertexDesc));
vertexDesc.Usage = D3D11_USAGE_DYNAMIC;
vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vertexDesc.ByteWidth = 4 * TOTAL_NUMBER_GRID_SQUARES * sizeof(Vertex);
vertexDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;

D3D11_SUBRESOURCE_DATA resourceData;
ZeroMemory(&resourceData, sizeof(resourceData));
resourceData.pSysMem = vertices;

d3dResult = d3dDevice->CreateBuffer(&vertexDesc, &resourceData, &vertexBuffer);

if(FAILED(d3dResult)){
    return false;
}

return true;
}

任何建议都将不胜感激! :)

1 个答案:

答案 0 :(得分:3)

在挖掘了一下之后找到答案 - 显然使用“ps_5_0”和“vs_5_0”存在一些问题,即使我的机器运行DirectX 11