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

Posted

技术标签:

【中文标题】如何将 glm::vec4<float> 转换为 GLfloat*?【英文标题】:How to convert a glm::vec4<float> to a GLfloat*? 【发布时间】:2014-01-13 16:37:04 【问题描述】:

我正在尝试将glm::vec4&lt;float&gt; 传递给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

【问题讨论】:

你为什么不直接做(GLfloat*)&amp;colors 由于我不知道 glm::vec4 的定义方式,我不确定它不会引起问题。 GLSL/GLM 文档似乎只讨论如何使用数据类型,而不是如何定义它们。 @BWG glColor4fv((GLfloat*)&amp;colors[0]); 工作。 @AndonM.Coleman:我不确定您的评论是否正确,但我的问题中的.data() 附加到向量的一个元素,而不是向量本身。 glm::vec4::data() 不存在,我只是想指出我想使用它的方式。 @slash: 抱歉,我的意思是说在 C++11 中,std::vector 有一个 .data (...) 成员函数,从所有意图和目的来看,它的作用与 &amp;SomeVector [0] 相同- 它为您提供了一个指向表示向量内部存储的连续内​​存块的指针。问题是,它是 C++ 标准库的 C++11 补充,&amp;SomeVector [0] 是做同样事情的更便携的方式。 【参考方案1】:

您可以使用glm::value_ptr。它适用于 glm::matglm::vec 并输入安全。

【讨论】:

glm::value_ptr 返回一个const 指针,但glColor4fv() 期望一个非const 指针。但是感谢您的链接,我从未找到此文档! 你确定吗?谷歌建议否则你使用什么样的 OpenGL 库。 你是对的,对不起。我正在使用一个定制的框架,它似乎使用与参考文档不同的规范。【参考方案2】:

您也可以这样做:

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] );

【讨论】:

以上是关于如何将 glm::vec4<float> 转换为 GLfloat*?的主要内容,如果未能解决你的问题,请参考以下文章

将mat3转换为mat4的最简单方法

GLM::Rotate 似乎会导致错误的旋转?

"glm::translate" 输出一个值不正确的矩阵

OpenGL顶点缓冲区对象的动态打包数据

如何解决 TypeError:无法将系列转换为 <type 'float'>

如何将该 UnsafeMutablePointer<UnsafeMutablePointer<Float>> 变量转换为 AudioBufferList?