我是OpenGL的初学者,我正在尝试绘制彩色方块,我按照OpenGL Book上的教程进行操作,我正在使用该示例来绘制here。由于这绘制了一个三角形,我修改了代码以绘制4个顶点。我创建了一个Rectangle类,可以以数组格式输出数据。这是我试图传递给 glBufferData 函数的数据。
不幸的是,当我使用我的班级数据时,它不会在屏幕上绘制任何内容。我甚至在检查gDebugger,我正在查看我的VBO并且数据不正确。
为了测试,我从我的类中提取了顶点并在本地数组中使用它们而不是从我的类返回的指针。
我的数据现在是:
Vertex Vertices[] =
{
{ { -0.5f, 0.5f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } },
{ { 0.5f, 0.5f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
{ { -0.5f, -0.5f, 0.0f, 1.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } },
{ { 0.5f, -0.5f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } }
};
而不是
Vertex* Vertices = rec->GetVertexData();
(我手动检查两个数组,它们具有完全相同的值,问题不在我的Rectangle代码中)现在调用 glBufferData(GL_ARRAY_BUFFER,BufferSize,Vertices,GL_STATIC_DRAW); 有效我在屏幕上看到了正确的矩形。 gDebugger中的数据为
经过一些研究后,我意识到 sizeof 没有报告给定指针的正确大小,所以我修复了它。我硬编码(现在) BufferSize = 128; 以便更快地测试。 Point是,它适用于Vertex数组,但仍然没有使用我班级的Vertex指针。
我已经搜索了glBufferData的示例,并且字面上没有一个显示如何使用指针中的数据,您认为这将是一个很好的示例。
那么如何将Vertex数组传递给我的glBufferData,它作为来自另一个类的指针返回?我正在使用带有GLEW和GLUT的OpenGL版本4。
更新:
所以错误是我的意思,我会在这里发布我的调试,希望它可以帮助其他人。我添加了一个名为Vertice的手表,8。这表明我的阵列有虚假值。一步一步的调试告诉我,当调用glGenBuffers时,它覆盖了我的值。我回去检查了我的代码,我意识到我的错误是调用Vertex vec[4];
而不是Vertex *vec = new Vertex[4];
,并且堆栈的值被另一个函数覆盖。
答案 0 :(得分:5)
通常错误的是数组是指针,而实际上它们不是。在许多情况下,数组表达式会衰减成指针(sizeof
是此规则的例外之一)但数组本身和指针之间存在显着差异。有关详细信息,请阅读this excellent post。
对于手头的问题,一旦数组衰减成指针,它的形状(第一维)就会丢失,这就是sizeof
返回指针大小而不是整个数组大小的原因
float arr[3] = { 1.0f, 2.0f, 3.0f }; // sizeof(arr) = 3 * sizeof(float)
float *ptr = arr; // sizeof(ptr) = sizeof(float*)
如何将Vertex数组传递给我的glBufferData,该glBufferData作为来自另一个类的指针返回?
你有三种选择。让类返回指向数组的指针(就像你现在一样)和添加另一个函数来公开其中元素的数量,即它的长度,用它来计算大小(以字节为单位)。但是,这不是一个非常优雅的解决方案,因为在C ++中可以引用数组,这将我们带到下一个解决方案(live example):
float (&MyClass::GetData()) [3] const
{
return arr;
}
此引用上的sizeof
运算符将正确返回整个数组的大小。您可以使用std::array
来避免像std::array<float, 3>& MyClass::GetData() const;
这样的神秘表达。
另一个更明智的选择是完全取消数组并使用std::vector
,您可以返回一个引用:
std::vector<float> const& MyClass::GetData() const
{
return vec;
}
在另一端
auto const &vec = obj->GetData();
float *data = vec.data();
size_t data_len = vec.size() * sizeof(float);
使用std::vector
的另一个好处是长度可以在运行时变化;由hairy nature of arrays引起的错误也较少。