D3D11 创建着色器:编码的顶点着色器大小与指定大小不匹配
D3D11 Create Shader: Encoded Vertex Shader size doesn't match specified size
我正在使用 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;
}
使用这些设置:PassThrough_PS属性
在渲染器中。
#include "Vertex ShadersPassThrough_VS.csh"
在渲染器中.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));
...
您应该查看 DirectX 工具包,特别是教程。
您没有包含有关tVertShader
类型的任何详细信息,但您很可能遇到引用计数问题。请考虑使用Microsoft::WRL::ComPtr
而不是原始指针来管理 Direct3D COM 对象的生存期。请参阅此文章。
相关文章:
- Qt SQLite没有查询或参数计数不匹配
- 模板参数推导失败,函数参数/参数不匹配
- 在使用累加时,C++中的运算符+不匹配
- C++ 与操作员不匹配<<
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 与'operator='不匹配(操作数类型'String'且"void")
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- C4018:类内有符号、无符号不匹配
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 为什么我收到错误:"运算符<<不匹配?
- RE2 不匹配非 ASCII 字符
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- D3D11 创建着色器:编码的顶点着色器大小与指定大小不匹配
- 运算符 = 不匹配,构造函数创建一个指针
- 动态创建的数组大小不匹配
- QT 创建器错误(运算符 + 不匹配)
- 匹配地图而不重新创建
- 类中的创建线程错误:类型'DWORD (windows_thread::)(void*)'的参数与"DWORD (*)(void*)"不匹配?