作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 directx sdk 中的 fxc.exe 实用程序来编译我的着色器,然后将它们作为字节数组加载到我的应用程序中(使用此代码):
inline std::vector<char> ReadToByteArray(char* filename)
{
std::ifstream file;
file.open(filename);
file.seekg(0, std::ios::end);
size_t file_size = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<char> data(file_size, 0);
file.read(&data[0], file_size);
return data;
}
然后创建它:
std::vector<char> pixelShaderBytecode = ReadToByteArray("myps.pso");
ID3D11PixelShader* shader;
device->CreatePixelShader(pixelShaderBytecode.data(), pixelShaderBytecode.size(), nullptr, &shader);
一切都很好。直到我的着色器增长到 ~980 字节大小。这是我在 HLSL 中的代码:
struct PInput
{
float4 position: SV_POSITION;
float3 normal : NORMAL;
};
cbuffer CBuffer
{
float4 color;
float4 dirs[8];
};
float4 main(PInput input) : SV_TARGET
{
// Example code...
int directionLightsCount = 2;
float intensity = 0.0f;
// Line 1
intensity += saturate(dot(input.normal, -dirs[0].xyz));
// Line 2
//intensity += saturate(dot(input.normal, -dirs[1].xyz));
float ambient = 0.1f;
return color * saturate(ambient + intensity);
}
问题是,如果我取消注释第 2 行,那么我将从 ID3D11Device::CreatePixelShader
方法中获取 E_INVALIDARG HRESULT
。还有来自 D3D11 调试层的警告:
D3D11 ERROR: ID3D11Device::CreatePixelShader: Pixel Shader is corrupt or in an unrecognized format. [ STATE_CREATION ERROR #192: CREATEPIXELSHADER_INVALIDSHADERBYTECODE]
如果我再次评论这一行,那么一切都会起作用。如果我将更改它们(0 索引为 1),那么一切都会起作用。我看到的唯一区别 - 编译文件的大小(两行均为 980,第一行为 916)
这是我用来编译 hlsl 代码的命令:
C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x64>fxc /
T ps_5_0 /E "main" /Fo "ps.pso" ps.ps
这种行为的原因是什么?我错过了什么重要的事情吗?
感谢您的帮助。
编辑:忘了说,这两个版本都编译没有任何错误。此外,顶点着色器创建没有任何问题(1400 字节)。我正在使用 11_0 功能级别。
最佳答案
一个简单的错误:错误的文件读取...
inline std::vector<char> ReadToByteArray(char* filename)
{
std::vector<char> data;
std::ifstream file(filename, std::ios::in | std::ios::binary | std::ios::ate);
data.resize(file.tellg());
file.seekg(0, std::ios::beg);
file.read(&data[0], data.size());
return data;
}
关于c++ - Direct3D 11 CreatePixelShader (E_INVLIDARGS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14549020/
我正在使用 directx sdk 中的 fxc.exe 实用程序来编译我的着色器,然后将它们作为字节数组加载到我的应用程序中(使用此代码): inline std::vector ReadToByt
我是一名优秀的程序员,十分优秀!