【问题标题】:How to convert a glm::vec4<float> to a GLfloat*?如何将 glm::vec4<float> 转换为 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] 是做同样事情的更便携的方式。

标签: c++ opengl glm-math


【解决方案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] );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多