c++ - glBuffer 使用一种数据样式而不使用另一种样式,为什么?

标签 c++ opengl

我正在研究一些 OpenGL 教程示例并修改它们以满足我的项目目标。

问题是程序使用这个数据结构(即它画了一个三角形)

    float firstTriangle[] = {
        -0.9f, -0.5f, 0.0f,  // left
        -0.0f, -0.5f, 0.0f,  // right
        -0.45f, 0.5f, 0.0f,  // top
    };

    glBufferData(GL_ARRAY_BUFFER, sizeof(firstTriangle), firstTriangle, GL_STATIC_DRAW);

但是当我进行以下更改时它不会绘制三角形:

    std::vector<float> thisslice;
    thisslice.push_back((float) -0.9f);
    thisslice.push_back((float) -0.5f);
    thisslice.push_back((float) 0.0f);
    thisslice.push_back((float) 0.0f);
    thisslice.push_back((float) -0.5f);
    thisslice.push_back((float) 0.0f);
    thisslice.push_back((float) -0.45f);
    thisslice.push_back((float) -0.5f);
    thisslice.push_back((float) 0.0f);

    glBufferData(GL_ARRAY_BUFFER, thisslice.size() * sizeof(float), &thisslice[0], GL_STATIC_DRAW);

我在这里缺少什么?

最佳答案

上面显示的代码应该 有效。这不是很好,但它应该工作。这让我觉得你可能已经减少了在这里发布的例子?它可能不起作用的可能原因是:

  • vector 是空的,所以 thisslice[0] 是一个解引用的尝试 NULL,并抛出异常(这就是为什么,如前所述 上面,你应该使用 .data() 来代替)。不过,这通常只会在 Debug模式下发生。
  • 你实际中的 vector code 是一个 const ref,这意味着 thisslice[0] 返回一个 float (而不是 float &)。拿地址就是给你地址 一些临时对象,而不是 vector 中的数据。

作为旁注,重复调用 push_back 是初始化 std::vector 的可怕方式。预先分配大小,并使用 [] 运算符来分配元素。或者使用初始化列表、分配或采用开始和结束的构造函数。

另一方面,为什么要在每次 push_back 调用中将 float 转换为 float?

关于c++ - glBuffer 使用一种数据样式而不使用另一种样式,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56962342/

相关文章:

c++ - OBJ、Buffer 对象和面索引

opengl - 如何一次加载模型并在 OpenGL 中重用它

iphone - 开发iPhone游戏时 "gotchas"是什么?

c++ - 在 C++ 函数中返回两种不同类型的两个值

java - 在关闭远程桌面连接时运行 s/w

c++ - 如何使用 float 组中的数据初始化 cv::Mat

c++ - 动态数组分配随机崩溃

c++ - FFMPEG RTSP 使用 libx264 流到 MPEG4/H264 文件

opengl - 片段着色器 GLSL 中的颜色插值?

qt - 在带有按钮和文本控件的窗口中显示 opencv 框架