如何将glm :: vec4 <float>转换为GLfloat *?</float>

时间:2014-01-13 16:37:04

标签: c++ opengl glm-math

我正在尝试将glm::vec4<float>传递给gl::ImmediateMode::glColor4fv(GLfloat*)

std::vector<glm::vec4> colors;
colors.push_back(vec4(1.0f, 0.0f, 0.0f, 1.0f));
glColor4fv(colors[0]);

我收到以下错误消息:

error: not matching function call to 'ImmediateMode::glColor4fv(const vec4&) const'
[...]
candidate is: [...] void gl::ImmediateMode::glColor4fv(GLfloat*) const

显然我必须将我的glm :: vec4转换为GLfloat数组。我通读GLSLanguage Specifications并找不到任何直接访问数据的方法。以下尝试有效:

GLfloat *c = new GLfloat[4];
c[0] = colors[0].r;
c[1] = colors[0].g;
c[2] = colors[0].b;
c[3] = colors[0].a;
glColor4fv(c);

但我宁愿使用更优雅的东西。那么有没有办法访问glm :: vec4中的数据数组以允许访问如下?

glColor4fv(reinterpret_cast<GLfloat*>(colors[0].data())); 
// .data() would hand me a pointer to the float array of the vec4

2 个答案:

答案 0 :(得分:5)

您可以使用glm::value_ptr。它适用于glm::matglm::vec,并且类型安全。

答案 1 :(得分:5)

你也可以这样做:

std::vector< vec4 > colors;
colors.push_back(vec4(1.0f, 0.0f, 0.0f, 1.0f));
glColor4fv( &colors[0].r );
// or this
glColor4fv( &colors[0][0] );