【问题标题】:How do I pass vertices[] to a constructor?如何将 vertices[] 传递给构造函数?
【发布时间】:2017-05-09 05:08:26
【问题描述】:

我正在使用 C++ 和 OpenGL。我正在尝试对模型加载器和渲染器进行一些模拟设计。

这是我卡住的地方:

我一直在用我的渲染器类和窗口类在屏幕上绘制,那里没有问题。 我正在使用一个通用模型类,直到现在它被硬编码为获取顶点 [108] 和颜色 [108] 并绘制一个立方体。这很有效,我可以实例化数百个立方体就好了。但是,我总是使用顶点[108] 和颜色[108] 创建模型。

现在我想放弃 [108] 并将任意大小的顶点和颜色传递给模型构造函数。

现在看起来像伪代码:

//this is in main.cpp
GLfloat vertices[108] = {
//vertices here
};
GLfloat colors[108] = {
//colors
};
mynamespace::Model::cube(vertices,colors);

这就是我在模型类中一直使用它的方式:

`//this is in model class declaration
GLfloat vertices_[108];
GLfloat colors_[108];
//then in the constructor definition
Model::Model(vertices,colors) {
//loop through, i<108, and assign vertices,colors to vertices_,colors_
}
`

这对于学习目的来说效果很好。我现在想开始创建各种大小的 vertices[] 并将它们发送到 Model 构造函数。 (顶点和颜色的数量将匹配 - 将检查)。但是我很难删除那个硬编码索引,例如vertices[108],然后只发送 vertices[unknown until it 到达]。

我想,最坏的情况,我可以发送一个顶点[],然后在构造函数 defn 中接收顶点,检查 sizeof() 并除以 4,如果没有其他方法可以通过循环赋值。但是,当我通过发送任何大小的 vertices[] 并打印出 sizeof() 来检查它时,我总是得到 4 个字节......当然什么也没有。

需要明确的是,我的代码中没有出现错误,也没有要调试的特定代码,因此我没有粘贴现有代码示例来解决任何问题。这意味着在这里是我想要做的,有经验的人有什么建议。

做这种事情的好习惯是什么?

在此之后,我想开始从文件加载网格,但首先我想了解我应该如何传递不同数量的顶点并制作模型,以便我可以将模型发送到渲染器。

【问题讨论】:

  • 您可以依赖于顶点的外部存储,只需将指针和大小(顶点数)传递给模型类的构造函数。您还可以使用这些参数在模型类中创建“私有”副本。为此,请阅读std::vector。要从std::vector 中提取“原始数据”,它提供了一个方法std::vector::data()
  • 成功了 - 非常感谢!

标签: c++ opengl


【解决方案1】:

只需使用std::vector(您需要先包含&lt;vector&gt;)。

//this is in model class declaration
std::vector<GLfloat> vertices_;
std::vector<GLfloat> colors_;
//then in the constructor definition
Model::Model(const std::vector<GLfloat> &vertices, const std::vector<GLfloat> &colors) {
    vertices_ = vertices;
    colors_ = colors;
}

然后:

std::vector<GLfloat> vertices = {
//vertices here
};
std::vector<GLfloat> colors = {
//colors
};

mynamespace::Model cube(vertices,colors);

当然,如果你有using std::vector;using namespace std;,你可以删除所有std::s

【讨论】:

  • @Varaquilex 我考虑过省略move。但是如果我省略了它,除了你之外的其他人会写一篇关于我应该如何使用移动语义的评论。如果您害怕std::move 调用,可以在此处省略它们——它不会破坏任何东西,但代码可能会运行得稍微慢一些。 (反正已经有副本了)
  • 哈哈,你是对的,否则有人会指出你错过了移动语义。我猜你不可能满足所有的程序员。
  • 确认,这里没有理由告诉初学者使用移动语义。只需通过 const ref 并初始化;无论哪种方式,它都是一个副本。即使对于非初学者,许多人也认为除非有需要,否则不应使用值和移动初始化。
  • 当然...提示“你应该使用初始化列表”和“你不应该告诉初学者使用 const”在 5...4...3...
【解决方案2】:

您得到 4 个字节,因为当您将数组传递给函数时,数组退化为 Type * 指针。所以你没有得到数组的长度,而是得到了指针的大小。

既然你说过你对两者都是新手。

解决问题的一个简单方法是定义你的乐趣

fun(Type array,int n)

当你调用时,你会这样调用:

fun(array,sizeof(array))

这应该可以解决您的问题。

【讨论】:

  • 哦,这就是我得到 4 个字节的原因,我没有意识到。这可以将数组发送到构造函数中。由于在模型类中初始化了未知的数组大小,我在将其复制到模型对象时遇到了一些麻烦。但是我可以将它发送进来并用它做一些事情,但是试图复制到类的顶点给我带来了麻烦。上面的 Scheff 回复使用类中的 std::vector 来复制它,但如果我像你在这里展示的那样传递它,然后复制到类中的向量。谢谢!
  • @Necromon Np。其实有很多方法可以绕过。一种通用的方法是只传递一个结构,该结构具有您想要存储的任何值,这与 glsl 或通用包装类中的概念接口块非常相似。当您在大多数情况下针对特定主题而不是语言时,这非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 2015-12-18
  • 2012-10-29
  • 2020-02-14
  • 1970-01-01
相关资源
最近更新 更多