如何将 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<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
【问题讨论】:
你为什么不直接做(GLfloat*)&colors
?
由于我不知道 glm::vec4 的定义方式,我不确定它不会引起问题。 GLSL/GLM 文档似乎只讨论如何使用数据类型,而不是如何定义它们。
@BWG glColor4fv((GLfloat*)&colors[0]);
工作。
@AndonM.Coleman:我不确定您的评论是否正确,但我的问题中的.data()
附加到向量的一个元素,而不是向量本身。 glm::vec4::data()
不存在,我只是想指出我想使用它的方式。
@slash: 抱歉,我的意思是说在 C++11 中,std::vector
有一个 .data (...)
成员函数,从所有意图和目的来看,它的作用与 &SomeVector [0]
相同- 它为您提供了一个指向表示向量内部存储的连续内存块的指针。问题是,它是 C++ 标准库的 C++11 补充,&SomeVector [0]
是做同样事情的更便携的方式。
【参考方案1】:
您可以使用glm::value_ptr。它适用于 glm::mat
和 glm::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*?的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 TypeError:无法将系列转换为 <type 'float'>
如何将该 UnsafeMutablePointer<UnsafeMutablePointer<Float>> 变量转换为 AudioBufferList?