AnpyD 2022-02-13 10:26 采纳率: 100%
浏览 50
已结题

LearnOpenGL中glBufferData中传入的数据为什么是容器的第一个元素,而不是整个容器?

在学习LearnOpenGL第三章《导入模型》的《网格》中有一个问题一直没有搞明白,就是
glBufferData中传入的数据为什么是容器的第一个元素,而不是整个容器?

struct Vertex {
    glm::vec3 Position;
    glm::vec3 Normal;
    glm::vec2 TexCoords;
};

vector<Vertex> vertices;
vector<unsigned int> indices;

void setupMesh()
{
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glGenBuffers(1, &EBO);

    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
     
     // 这里的&vertices[0]为什么不是&vertices
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW);  

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
     //  这里的&indices[0]为什么不是&indices
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), 
                 &indices[0], GL_STATIC_DRAW);

    // 顶点位置
    glEnableVertexAttribArray(0);   
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);
    // 顶点法线
    glEnableVertexAttribArray(1);   
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Normal));
    // 顶点纹理坐标
    glEnableVertexAttribArray(2);   
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, TexCoords));

    glBindVertexArray(0);
}  
  • 写回答

2条回答 默认 最新

  • 关注
    
    glBufferData函数的第三个参数是const GLvoid *类型,&indices[0]是取vector中第一个元素的地址,
    它的类型是unsigned int *,可以转换为GLvoid *类型,
    并且vector类型的存储空间是连续的,也就是说,
    通过&indices[0]是可以访问到vector中的所有元素的。
    ----------------------------------------------
    GLvoid* 默认要求是传入连续空间数据,而&indices的类型是vector<unsigned int > *类型,
    这个类型转换的时候,得到的数据是多个vector<unsigned int >元素,
    虽然单个vector<unsigned int >中的元素是连续的,
    但是多个vector<unsigned int >之间的地址却是相互独立的。
    所以这里用的是&indices[0],而不是&indices
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月21日
  • 已采纳回答 2月13日
  • 创建了问题 2月13日

悬赏问题

  • ¥15 企业资源规划ERP沙盘模拟
  • ¥15 树莓派控制机械臂传输命令报错,显示摄像头不存在
  • ¥15 前端echarts坐标轴问题
  • ¥15 CMFCPropertyPage
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题
  • ¥15 谁会P4语言啊,我想请教一下
  • ¥15 这个怎么改成直流激励源给加热电阻提供5a电流呀