Я использую 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 к последним парам, ожидая получить S_FALSE как код возврата)
Я не уверен, что еще попытаться решить это.
Вы также компилируете эффект, а не сырой шейдер. Чтобы скомпилировать как шейдер, используйте vs_5_0 или ps_5_0 для вершинных/пиксельных шейдеров, соответственно. Вы должны увидеть падение размера шейдерного кода с 15 000 до, вероятно, 200-400 байт, а может быть, и меньше. – Alex