我正在使用DirectX 11.我预先编译着色器,然后在运行时加载。我将文件加载到缓冲区,然后将其发送到CreateVertexShader。当我打电话CreateVertexShader与调试层打开时,我得到以下错误:DirectX 11:编码的顶点着色器大小与指定大小不匹配
Encoded Vertex Shader size doesn't match specified size
我编译顶点着色器在命令行,如下所示:
fxc /Fc /Od /Zi /T fx_5_0 /Fo "myfile.cso" "myfile.fx"
在的情况下简单的着色器,结果文件大约200字节。我可以验证Windows资源管理器和我的代码都报告相同数量的字节。
我试过了fx_5_0的变体。
这里是我正在加载文件:
uint32_t length, rr;
char *buffer;
FILE *fp;
fp = fopen("<path to file>\\myfile.cso", "rb");
fseek(fp, 0, SEEK_END);
length = ftell(fp);
fseek(fp, 0, SEEK_SET);
buffer = (char*)calloc(1, length);
rr = fread(buffer, sizeof(char), length, fp);
fclose(fp);
assert(rr == length);
然后:
hr = device->lpVtbl->CreateVertexShader(device, buffer, length, NULL, NULL);
(注:我传递NULL到最后PARAM期望得到S_FALSE用作返回代码)
我不知道还有什么可以尝试解决这个问题。
您还在编译效果,而不是原始着色器。要作为着色器编译,分别使用vs_5_0或ps_5_0作为顶点/像素着色器。您应该看到着色器代码大小从15k降到200-400字节,甚至更少。 – Alex 2014-12-01 21:06:19