gpt4 book ai didi

c++ - 带有指针数据的 OpenGL glBufferData

转载 作者:搜寻专家 更新时间:2023-10-31 00:34:37 28 4
gpt4 key购买 nike

我是 OpenGL 的初学者,我正在尝试绘制一个彩色方 block ,我遵循了 OpenGL Book 上的教程。我正在使用示例绘制 here .因为这绘制了一个三角形,所以我修改了代码以绘制 4 个顶点。我制作了一个 Rectangle 类,可以以数组格式输出它的数据。这是我试图传递给 glBufferData 函数的数据。

不幸的是,当我使用我类(class)的数据时,它没有在屏幕上绘制任何东西。我什至检查了 gDebugger,我正在查看我的 VBO,但数据不正确。

Wrong gDebugger

为了测试,我从我的类中提取顶点并在本地数组中使用它们而不是从我的类返回的指针。

我现在的数据是:

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 中的数据为

Correct gDebugger

经过一些研究,我意识到 sizeof 没有报告给定指针的正确大小,所以我修复了它。我硬编码(现在)BufferSize = 128; 以便更快地进行测试。重点是,它适用于 Vertex 数组,但仍然不适用于我的类中的 Vertex 指针。

我用谷歌搜索了 glBufferData 的示例,但实际上没有一个向您展示如何使用来自指针的数据,您会认为这是一个很好的示例。

那么我如何将一个 Vertex 数组传递给我的 glBufferData ,它作为另一个类的指针返回?我将 OpenGL 版本 4 与 GLEW 和 GLUT 一起使用。

更新:

所以错误在我身上,我会在这里发布我的调试,希望它能帮助其他人。我添加了一个名为 Vertice, 8 的 Watch。这表明我的数组有虚假值。通过逐步调试,我发现调用 glGenBuffers 时它正在覆盖我的值。我回去检查我的代码,我意识到我的错误是调用 Vertex vec[4]; 而不是 Vertex *vec = new Vertex[4]; 和堆栈的值被另一个函数覆盖。

最佳答案

人们常常误以为数组是指针,而实际上它们不是。在许多情况下,数组表达式 会衰减为指针(sizeof 是此规则的异常(exception)之一),但数组本身与指针之间存在显着差异。更多信息,请阅读 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*)

how can I pass an array of Vertex to my glBufferData that's being returned as a pointer from another class ?

您可以通过三个选项来执行此操作。使类返回指向数组的指针(就像您现在所做的那样)添加另一个函数来公开其中元素的计数,即它的长度,您可以用它计算大小(以字节为单位)。然而,这不是一个非常优雅的解决方案,因为在 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 而导致的错误也较少.

关于c++ - 带有指针数据的 OpenGL glBufferData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25713992/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com