Class 在发布模式下编译时会产生奇怪的结果

Class 在发布模式下编译时会产生奇怪的结果,class,opengl,vector,release,mode,Class,Opengl,Vector,Release,Mode,我已经编写了一个向量类,用于我的3D“引擎”。在调试模式下编译时,它的工作原理与预期相同,但在发布模式下编译时,颜色完全错误。它不再是我指定的颜色,而是随着摄影机的变化而变化的纯色:s 我拍了一些照片来展示它的样子:和。请注意,我还使用这个类来转换顶点,它在调试和发布模式下都可以正常工作 这就是我将颜色向量传递给着色器(伪代码)的方式 如果您需要查看更多代码,请告知 这是我的Vector类源代码:(必须删除http://因为我只能发布2个超链接)。 这已经困扰了我一段时间,所以非常感谢您的帮助

我已经编写了一个向量类,用于我的3D“引擎”。在调试模式下编译时,它的工作原理与预期相同,但在发布模式下编译时,颜色完全错误。它不再是我指定的颜色,而是随着摄影机的变化而变化的纯色:s

我拍了一些照片来展示它的样子:和。请注意,我还使用这个类来转换顶点,它在调试和发布模式下都可以正常工作

这就是我将颜色向量传递给着色器(伪代码)的方式

如果您需要查看更多代码,请告知

这是我的Vector类源代码:(必须删除http://因为我只能发布2个超链接)。 这已经困扰了我一段时间,所以非常感谢您的帮助

编辑:好吧,我解决了!呵呵,向量类没有什么问题,我是如何把它发送给着色器的

问题是,我有两个函数将数据传递给着色器,第一个是我在第一篇文章中展示的函数,另一个(我实际使用的)采用统一结构数组(自定义结构),显然在发布模式下一个不起作用


很抱歉浪费您的时间,感谢您的帮助=)

我同意cli\u 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个字节中,因此传入指向向量的指针应该相当于传入一个由三个
float
s组成的数组。我相信这通常是有效的,但如果您确定问题发生在给定的代码行中,则可能值得尝试。

您的Vector类在我看来完全正常。由于这只在发布模式下发生,请在所有代码中查找(或查找)未初始化的变量(通常在调试模式下,变量会初始化,而在发布模式下则不会)。为我们提供vector类本身的源代码如何?否则这只是猜测,没有正确初始化的内容。@datenwolf如果源代码在我的帖子中链接,您可能会错过它,因为它是纯文本的,不是真正的链接。不过这里又是:@Traxmate:的确如此。我把它做成了一个链接。像那样做确实有用,但有点乏味。。。我已经通过设置一个断点来获取地址,然后使用作弊引擎来检查它是否正常,如图所示:未初始化的变量不应该有问题,因为类自动将所有变量初始化为0,但所有这些对我来说都是新的,所以我可能错了:p如果你这样做了,它就会正常工作这样,为什么不在vertex类中创建一个返回浮点数组的方法,这样就不必显式地获取每个组件?
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);