C++ D3D11创建着色器:编码的顶点着色器大小不';不匹配指定的大小

C++ D3D11创建着色器:编码的顶点着色器大小不';不匹配指定的大小,c++,rendering,directx-11,vertex-shader,C++,Rendering,Directx 11,Vertex Shader,我正在使用DirectX 11开发一个游戏引擎,在让着色器正确编码方面遇到了问题。我正在将着色器预编译到.csh文件,并使用字节码创建着色器 我在尝试创建任何着色器时都会遇到此错误,但在本例中,我将使用我的穿透顶点着色器 D3D11 ERROR: ID3D11Device::CreateVertexShader: Encoded Vertex Shader size doesn't match specified size. [ STATE_CREATION ERROR #166: CREATE

我正在使用DirectX 11开发一个游戏引擎,在让着色器正确编码方面遇到了问题。我正在将着色器预编译到.csh文件,并使用字节码创建着色器

我在尝试创建任何着色器时都会遇到此错误,但在本例中,我将使用我的穿透顶点着色器

D3D11 ERROR: ID3D11Device::CreateVertexShader: Encoded Vertex Shader size doesn't match specified size. [ STATE_CREATION ERROR #166: CREATEVERTEXSHADER_INVALIDSHADERBYTECODE]
着色器:

#include "../VertexLayouts.hlsli"
// structs in included file
struct PASS_THROUGH_VS
{
    float3 pos : POSITION;
    float2 texCoord : TEXCOORD;
};

struct PASS_THROUGH_PS
{
    float4 pos : SV_POSITION;
    float2 texCoord : TEXCOORD;
};


PASS_THROUGH_PS main( PASS_THROUGH_VS input )
{
    PASS_THROUGH_PS output = (PASS_THROUGH_PS)(0);
    output.pos = float4(input.pos, 1);
    output.texCoord = input.texCoord;
    return output;
}
使用以下设置:

在渲染器中

#include "Vertex Shaders\PassThrough_VS.csh"
在Renderer.cpp中

HRESULT hrReturn;

    hrReturn = CreateVertexShader(&PassThrough_VS, sizeof(PassThrough_VS), Pass_Through_VS);
    if (FAILED(hrReturn)) {}
        //return hrReturn;

HRESULT CRenderer::CreateVertexShader(const void* ptrByteCode, SIZE_T szByteCodeLength, eVertexShaderType type)
{
    HRESULT hrReturn;
    tVertShader newShader = {};
    hrReturn = D3Device->CreateVertexShader(&ptrByteCode, szByteCodeLength, nullptr, &(newShader.m_id3dShader)); // WHERE ERROR OCCURS
    if (FAILED(hrReturn))
        return hrReturn;
    newShader.m_ptrByteCode = ptrByteCode;
    newShader.m_szByteCodeLength = szByteCodeLength;
    D3VertexShaders[type] = newShader;
    return hrReturn;
}

问题是您正在将一个指针传递给一个指针,因此实际上没有将着色器blob数据传递给Direct3D

HRESULT CRenderer::CreateVertexShader(const void* ptrByteCode, SIZE_T szByteCodeLength, eVertexShaderType type)
{
    HRESULT hrReturn;
    tVertShader newShader = {};
    hrReturn = D3Device->CreateVertexShader(&ptrByteCode, szByteCodeLength,
        nullptr, &(newShader.m_id3dShader));
    ...    
正确的代码是:

HRESULT CRenderer::CreateVertexShader(const void* ptrByteCode, SIZE_T szByteCodeLength, eVertexShaderType type)
{
    HRESULT hrReturn;
    tVertShader newShader = {};
    hrReturn = D3Device->CreateVertexShader(ptrByteCode, szByteCodeLength,
        nullptr, &(newShader.m_id3dShader));
    ...    
你应该看一看,尤其是


您没有包含关于
tVertShader
类型的任何详细信息,但很可能存在引用计数问题。考虑使用<代码>微软::WRL::COMPTR < /代码>,而不是用于管理Direct3D COM对象生命周期的原始指针。请参阅。

我在每个着色器模型上都尝试过它,更新了驱动程序,然后又回去尝试了一个简单的顶点着色器,它以前可以工作,但现在不行。另一个问题是.cso或.csh的原因是什么?有人教我如何使用.csh方法,但我一辈子都记不起老师给出的理由。此外,这似乎是一种非常罕见的技术,因为谷歌或必应上没有关于该文件类型的内容。感谢您的回复。我目前正在工作,所以在我尝试解决方案之前还有一点时间。的确,我有参考问题,我以前使用过comptrs,但我似乎有多个地方资源分配不当。在tVertex结构中,着色器由ID3D11着色器指针持有,字节码为const void*。