c++ - 在创建顶点着色器时需要帮助理解无效参数错误

标签 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(result) 语句):

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;
}

如有任何建议,我们将不胜感激! :)

最佳答案

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

关于c++ - 在创建顶点着色器时需要帮助理解无效参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17246877/

相关文章:

winapi - 如何使用DirectWrite在面向脚本的OpenType功能与其他OpenType功能之间取得平衡?

windows - ID2D1Bitmap 和 IWicBitmap 之间的区别

c++ - 成员函数,无法推导 ‘auto’

c++ - 打印所有继承的类成员变量和方法

c++ - 在 C++ 中,我不能在不分离 header 和 cpp 的情况下实现这些类吗?

c++ - DirectX 渲染到纹理

c++ - 如何将模板构造函数特化移动到 cpp 文件?

c++ - 销毁 directx 设备和交换链

c++11 - 无法创建 Direct2D DXGI 表面

c++ - 了解 ID3D11Device 和 ID3D11DeviceContext