glUniforms()和[]运算符重载问题

时间:2012-07-11 21:30:20

标签: c++ opengl pointers reference

我遇到一些问题需要编译以下代码:

GLint iModelMatrix = glGetUniformLocation(m_shaderProgramID, "mvMatrix");
glUniformMatrix4fv(iModelMatrix, 1, GL_FALSE, &myMatrix[0]);

GLint iLight = glGetUniformLocation(m_shaderProgramID, "vLightPos");
glUniform3fv(iLight, 1, &myVector[0]);

现在myMatrix和myVector是两个对象,每个类都有[]运算符重载,如下所示:

inline float& operator[](int index)     { return m_data[index]; }
inline float  operator[](int index) const   { return m_data[index]; }

我收到以下错误:

error C2102: '&' requires l-value

我正在尝试为什么'&'需要左手边值?我以前传过这样的数据。我不是简单地将地址提供给m_data数组的第一个索引?这不构成浮动*?

为什么它不满足功能规范?

void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);

编辑:

好吧,似乎因为我将这些对象作为const引用传递给进行上述调用的函数,它通过值传递float *数组,因此我无法引用它们。

我尝试添加第三个[]运算符:

inline const float& operator[](int index) const    { return m_data[index]; }

但这让我的编译器爆炸了。有什么理由不能这样做吗?

2 个答案:

答案 0 :(得分:2)

此:

inline float  operator[](int index) const   { return m_data[index]; }

应该转换到这个:

inline const float &operator[](int index) const   { return m_data[index]; }

如果你想获取返回值的地址。你没有添加第三个版本;你将当前的一个改为。您不能使用临时地址,但可以使用const&的地址。

就我个人而言,我认为你应该有一个只返回float*const float*的特殊功能,就像C ++ 11对std::vector::data所做的那样。这样,您只需致电myMatrix.data()而不必执行&...[0] kludge。这是自我记录和明显的。

答案 1 :(得分:-2)

只需将operator[]的结果存储在本地变量中:

float tmp = myMatrix[0];
glUniformMatrix4fv(iModelMatrix, 1, GL_FALSE, &tmp);

这可以避免不能被视为l值的未命名临时。