【问题标题】:DirectX 11: Encoded Vertex Shader size doesn't match specified sizeDirectX 11:编码的顶点着色器大小与指定大小不匹配
【发布时间】:2014-11-25 05:50:22
【问题描述】:

我使用的是 DirectX 11。我预编译了着色器,然后在运行时加载。我将文件加载到缓冲区中,然后将其发送到 CreateVertexShader。当我在调试层打开的情况下调用 CreateVertexShader 时,出现以下错误:

编码的顶点着色器大小与指定大小不匹配

我在命令行编译顶点着色器如下:

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 传递给期望获得 S_FALSE 作为返回码的最后一个参数)

我不确定还有什么办法可以解决这个问题。

【问题讨论】:

    标签: shader direct3d directx-11 hlsl direct3d11


    【解决方案1】:

    我想通了。

    入口点在着色器中不正确。

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

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

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

    【讨论】:

    • 您也在编译效果,而不是原始着色器。要编译为着色器,请分别对顶点/像素着色器使用 vs_5_0 或 ps_5_0。您应该会看到着色器代码大小从 15k 下降到大概 200-400 字节,甚至可能更少。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多