2014-11-25 15 views
0

저는 DirectX 11을 사용하고 있습니다. 셰이더를 미리 컴파일 한 다음 런타임에로드하고 있습니다. 파일을 버퍼에로드 한 다음 CreateVertexShader로 보냅니다.DirectX 11 : 인코딩 된 정점 셰이더 크기가 지정된 크기와 일치하지 않습니다.

Encoded Vertex Shader size doesn't match specified size

다음과 같이 내가 명령 줄에서 버텍스 쉐이더를 컴파일하고 있습니다 : a의 경우

fxc /Fc /Od /Zi /T fx_5_0 /Fo "myfile.cso" "myfile.fx" 

을 내가 CreateVertexShader를 호출 할 때 디버그 층이 켜져으로, 나는 다음과 같은 오류가 발생합니다 간단한 쉐이더이면 결과 파일은 약 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); 

(참고 : 나는 리턴 코드로 S_FALSE를 얻을 것으로 예상 마지막 PARAM에 NULL을 전달하고 있습니다)

이 문제를 해결하기 위해 무엇을해야할지 모르겠습니다.

답변

0

나는 그것을 알아 냈다.

진입 점이 셰이더에서 올바르지 않습니다.

fxc 명령은 오류나 경고없이 내 쉐이더를 컴파일했지만, 내 쉐이더에는 올바르게 정의 된 진입 점이 없었습니다. 기묘한.

그래서 바이트 코드는 약 200 바이트에 불과합니다. 즉, 쉐이더는 매우 간단하고 통과가 가능하며 200 바이트라고 믿을 수있었습니다. 15k 컴파일과 비슷합니다.

그것은 짧은 HLSL 프로그램 (소스의 1061 바이트) 바이트 코드의 15K에 폭발하는 방법을 정말 이상하다.

+0

또한 원시 쉐이더가 아닌 효과를 컴파일하고 있습니다. 셰이더로 컴파일하려면 vs_5_0 또는 ps_5_0을 각각 정점/픽셀 셰이더에 사용하십시오. 셰이더 코드 크기가 15k에서 200-400 바이트로 떨어지는 것을보아야합니다. – Alex