Странные результаты при компиляции в режиме релиза - PullRequest
0 голосов
/ 27 ноября 2011

Я написал класс Vector, который я использую для своего трехмерного "движка".Он работает так же, как задумано, когда компилируется в режиме отладки, но когда компилируется в режиме выпуска, цвета совершенно неправильные.Вместо того, чтобы быть цветами, которые я указал, он становится сплошным цветом, который меняется с камерой: s.

Я сделал снимки, чтобы показать, как это выглядит: режим отладки и режим разблокировки .Обратите внимание, что я также использую этот класс для преобразования моих вершин, и он отлично работает как в режиме отладки, так и в режиме выпуска.

Так я передаю векторы цветов в свой шейдер (псевдокод).

Vector3 Diffuse = Vector3(0.3f, 0.5f, 1.0f);
Vector3 Ambient = Vector3(0.3f, 0.3f, 0.3f);

Shaders.SetUniformData("AmbientColor", sizeof(float) * 3, 1, &Ambient);
Shaders.SetUniformData("DiffuseColor", sizeof(float) * 3, 1, &Diffuse);

Скажите, пожалуйста, если вам нужно больше кода.

А вот мой исходный код класса Vector: http://pastebin.com/spy7FWFg (пришлось удалить http: //, потому что мне разрешено публиковать только2 гиперссылки).Это беспокоило меня некоторое время, поэтому любая помощь очень ценится.

РЕДАКТИРОВАТЬ : Хорошо, я решил это!Хех, с классом Vector все было в порядке, я отправил его в шейдеры ...

Дело в том, что у меня есть две функции, которые я сделал для передачи данных в шейдеры, первая из нихЯ показал в первом посте, а другой (который я использовал по-настоящему) принимает массив структур UNIFORM (пользовательская структура) и, по-видимому, один из них не работает в режиме выпуска ...

Извините за тратуВаше время и спасибо за вашу помощь =)

1 Ответ

0 голосов
/ 27 ноября 2011

Я согласен с cli_hlt, в первую очередь нужно искать неинициализированные переменные в любом месте вашего кода. Еще один, несколько маловероятный, однако, это то, что вы можете попытаться сохранить ваши окружающие и рассеянные цвета в прямой float[] перед передачей их в:

float diffuseArray[] = { Diffuse.X,Diffuse.Y,Diffuse.Z };
float ambientArray[] = { Ambient.X,Ambient.Y,Diffuse.Z };
Shaders.SetUniformData("AmbientColor", sizeof(float) * 3, 1, ambientArray);
Shaders.SetUniformData("DiffuseColor", sizeof(float) * 3, 1, diffuseArray);

Таким образом, вы работаете в предположении (я думаю, вполне разумном), что все переменные-члены вашего вектора отображаются в памяти по порядку, в первых 12 байтах вашего объекта Vector, поэтому передается указатель на вектор должен быть эквивалентен передаче в массиве из трех float с. Я считаю, что в целом это действительно так, но, возможно, стоит попробовать, если вы уверены, что проблема возникает в данных строках кода.

...