我已经编写了一个Vector类,用于我的3D"引擎"。在调试模式下编译时,它的工作方式与预期相同,但在发布模式下编译时颜色完全错误。而不是我指定的颜色,它变成了随着相机改变的纯色:s。
我拍了照片来展示它的样子:debug mode和release mode。请注意,我还使用此类来转换顶点,并且在调试和释放模式下都能正常工作。
这就是我将颜色向量传递给着色器(伪代码)的方法。
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类没有错,我把它发送到着色器......
事情是我有2个功能我已经将数据传递给着色器,第一个是我在第一个帖子中显示的那个,另一个(我用于实际)使用UNIFORM数组结构(自定义结构),显然在发布模式下没有工作......
抱歉浪费你的时间并感谢你的帮助=)
答案 0 :(得分:0)
我同意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);
按原样,你正在(非常合理,我认为)假设所有Vector的成员变量按顺序出现在Vector对象的前12个字节中,所以传入一个指向vector应该相当于传入三个float
的数组。我相信这通常是有效的,但是如果您确定在给定的代码行中发生了问题,则可能值得尝试。