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 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号