2014-11-25 146 views
0

我正在使用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用作返回代码)

我不知道还有什么可以尝试解决这个问题。

回答

0

我想通了。

着色器中的入口点并不正确。

fxc命令编译我的着色器没有错误或警告,但我的着色器没有正确定义入口点。奇怪的。

这就是为什么字节码只有大约200字节。也就是说,我的着色器非常简单,是一个传递,我可以相信它是200字节。这更像是15k编译的。

一个简短的HLSL程序(1061字节的源代码)爆炸到15k字节代码真的很奇怪。

+0

您还在编译效果,而不是原始着色器。要作为着色器编译,分别使用vs_5_0或ps_5_0作为顶点/像素着色器。您应该看到着色器代码大小从15k降到200-400字节,甚至更少。 – Alex 2014-12-01 21:06:19