- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 OpenGL 的初学者,我正在尝试绘制一个彩色方 block ,我遵循了 OpenGL Book 上的教程。我正在使用示例绘制 here .因为这绘制了一个三角形,所以我修改了代码以绘制 4 个顶点。我制作了一个 Rectangle 类,可以以数组格式输出它的数据。这是我试图传递给 glBufferData 函数的数据。
不幸的是,当我使用我类(class)的数据时,它没有在屏幕上绘制任何东西。我什至检查了 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; 以便更快地进行测试。重点是,它适用于 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/
当创建一个 Buffer 并设置它的数据时,需要先将它绑定(bind)到一个 target,然后用一些数据填充绑定(bind)到该 target 的缓冲区: GLenum target = GL_AR
我想知道,如果我使用 glBufferData,它会在我调用它时准确地分配内存吗(也就是说,如果 size 参数大于此时的可用内存,它会崩溃)还是会它有某种特殊的即时规则,仅当我实际将数据复制到缓冲区
我所说的标志是 GL_STREAM_DRAW、GL_STATIC_DRAW 和 GL_DYNAMIC_DRAW。 The manual page is clear about when you sho
我尝试将索引加载到 GL_ELEMENT_ARRAY_BUFFER 中,但是当我尝试此操作时,它会用 0 分隔我的数据。 例如我加载了这些数据: [0 1 3 3 1 2] 使用函数glBufferD
我在 glBufferData 上有随机崩溃,它只发生在 Windows 上。 Mac OS 和 Linux 没有问题。这是我的上传功能,它将我保存在内存中的所有内容上传到 GPU。 vertex 是
我刚刚注意到,当我尝试使用大小:1085859108 和数据:NULL 调用 glBufferData 时,它会无提示地失败。 以下对 glBufferSubData 的调用失败并出现 OUT_OF_
我正在使用明确定义的顶点坐标数组创建 glBufferData,一切正常。使用未明确定义的数组时,结果完全不同,尽管我使用的是相同的坐标值。绘制调用以不同的顶点顺序渲染事物。 顶点是三角形网格。 代码
我正在尝试移植我的固定功能管线 openGL 代码以使用 GLSL,但我遇到了 glBufferData 的段错误。这一切都与固定功能的东西一起工作得很好(即我可以毫无问题地渲染加载的网格)。 这是加
This question询问是否可以依靠编译器不弄乱 struct 的值顺序和填充。 根据该问题的答案, OpenGL defines, very clearly, what the byte la
我不明白为什么这段代码会出现段错误: AxesMarker::AxesMarker(float size) : size_(size), vbo_vertices_(0), vbo_eleme
我正在使用 OpenGL实现某种批量绘图。为此,我创建了一个 vertex buffer来存储数据。 注意:这个缓冲区通常会在每一帧上更新,但永远不会减少大小(但仍然可以增加)。 我的问题是:使用 g
我正在使用 glBufferData 来保存一些渲染信息。 glBufferData(GL_ARRAY_BUFFER, vertex_size * sizeof(VertexData), vertic
在开发过程中,我注意到一个奇怪的“错误”,它只能在 Android 模拟器上重现。我正在使用具有 GPU 加速功能的 x86 版本。请查看以下代码: public class TestRenderer
我正在浏览 OGLdev教程,而且我一直坚持让顶点数组对象工作。相关代码如下: glBindBuffer(GL_ARRAY_BUFFER, buffers[POS_VB]); FloatBuffer
我有这段代码,它不起作用我不知道为什么,我认为它应该,但似乎第一个缓冲区数据被第二个缓冲区数据替换了。我想要实现的是第一个线条粗细与另一个不同, vector vert={-.4,.2,-.2,.6}
这个问题在这里已经有了答案: Can I delete a float array when I have used glBufferData? (2 个答案) When does OpenGL g
我有一个关于 OpenGL glBufferData() 方法的问题。我能否在 std::vector 、std::list 等结构中传递顶点数据,或者它必须是经典的 ( [] ) 数组? 最佳答案
在渲染器的初始化中,VBO被创建并绑定(bind)到GL_ARRAY_BUFFER或GL_ELEMENTS_ARRAY_BUFFER,第一个有三个顶点。调用glBufferData将这三个顶点的属性缓
我创建了一个顶点缓冲区对象类来管理应用程序中的大量顶点。用户调用构造函数创建一个glBuffer,调用glBufferData分配指定大小的空间。 有一个名为 resize 的类函数,允许用户通过再次
我是 OpenGL 的初学者,我正在尝试绘制一个彩色方 block ,我遵循了 OpenGL Book 上的教程。我正在使用示例绘制 here .因为这绘制了一个三角形,所以我修改了代码以绘制 4 个
我是一名优秀的程序员,十分优秀!