D3DXCompileShader странные ошибки при запуске вне Visual Studio - PullRequest
0 голосов
/ 12 мая 2011

У меня действительно два вопроса.

Первое - это больше описание событий: программное обеспечение использует DirectX 9 и компилирует шейдеры при запуске из ресурсов.Шейдеры прекрасно работают как с отладочной, так и с выпускной версиями, когда вы запускаете программное обеспечение из среды IDE, но когда вы дважды щелкаете по нему, чтобы запустить его отдельно, вы начинаете получать множество странных ошибок от D3DXCompileShader.

Я объяснил это тем, что Visual Studio конвертировал текстовые файлы шейдера в Unicode и что это как-то вызывает D3DXCompileShader.Почему они компилируются и работают нормально, когда я нахожусь в среде IDE, но не за ее пределами, остается загадкой (обратите внимание, что все равно не получится, если вы запустите его вне VS и затем подключите отладчик к процессу).У кого-нибудь есть мысли по этому поводу?

Мой второй вопрос касается попыток исправить вышесказанное.Вместо того, чтобы иметь свой собственный тип данных ресурса под названием SHADER, я импортировал шейдер как RCDATA, поэтому вместо ручной загрузки текста шейдера из ресурса я теперь могу использовать D3DXCompileShaderFromResource.Я получаю плохой HRESULT от моего вызова к этому, однако, коллекция «ошибок» остается пустой.Отладочного вывода от него нет вообще.Код выглядит следующим образом:

HRESULT result;

result = D3DXCompileShaderFromResource( 0, 
                                        MAKEINTRESOURCE(IDR_SHADERPHONG),
                                        NULL, 
                                        NULL, 
                                        "VERTEXMAIN",
                                        D3DXGetVertexShaderProfile(Window()->GetDevice()),
                                        D3DXSHADER_OPTIMIZATION_LEVEL3,
                                        &MyVertexShaderBuffer,
                                        &errors,
                                        &MyVertexShaderConstants);

HRESULT -2005529767, что, похоже, "не удалось".Я не могу найти никаких ссылок на веб-сайты о том, что это может означать в отношении D3DXCompileShaderFromResource!

Я надеюсь, что мои умные друзья в stackoverflow могут предложить некоторую помощь здесь: p.Спасибо.


1 Ответ

0 голосов
/ 13 мая 2011

ОК, проблема найдена (коллегой). При загрузке моего ресурса я захватывал блок памяти и неправильно преобразовывал его в std :: string. То есть std :: string будет проходить через ресурс в поисках нулевого терминатора, но данные ресурса не обязательно будут иметь его (это просто текстовый файл). В конечном итоге он найдет его, однако, вероятно, в какой-то части памяти, которую программное обеспечение не должно использовать!

Итак, чтобы преобразовать буфер символов из ресурса в std :: string, следует использовать следующее:

return std::string(reinterpret_cast<char const*>(pD), bytes);

не это:

return std::string(pD);

, если, конечно, вы точно не знаете, что pD указывает на строку с нулем в конце.

...