赞
踩
总结自bilibili赵新政老师的教程
code review!
代码
void prepareVBO() { //1 创建一个vbo *******还没有真正分配显存********* GLuint vbo = 0; GL_CALL(glGenBuffers(1, &vbo)); //2 销毁一个vbo GL_CALL(glDeleteBuffers(1, &vbo)); //3 创建n个vbo GLuint vboArr[] = {0, 0, 0}; GL_CALL(glGenBuffers(3, vboArr)); //4 销毁n个vbo GL_CALL(glDeleteBuffers(3, vboArr)); } void prepare() { float vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; //1 生成一个vbo GLuint vbo = 0; GL_CALL(glGenBuffers(1, &vbo)); //2 绑定当前vbo,到opengl状态机的当前vbo插槽上 //GL_ARRAY_BUFFER:表示当前vbo这个插槽 GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo)); //3 向当前vbo传输数据,也是在开辟显存 GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW)); } void prepareSingleBuffer() { //1 准备顶点位置数据与颜色数据 float positions[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; float colors[] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f }; //2 为位置&颜色数据各自生成一个vbo GLuint posVbo = 0, colorVbo = 0; GL_CALL(glGenBuffers(1, &posVbo)); GL_CALL(glGenBuffers(1, &colorVbo)); //3 给两个分开的vbo各自填充数据 //position填充数据 GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, posVbo)); GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW)); //color填充数据 GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, colorVbo)); GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW)); } void prepareInterleavedBuffer() { float vertices[] = { -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f }; GLuint vbo = 0; GL_CALL(glGenBuffers(1, &vbo)); GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo)); GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW)); }
代码
void prepareSingleBuffer() { //1 准备positions colors数据 float positions[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; float colors[] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f }; //2 使用数据生成两个vbo posVbo, colorVbo GLuint posVbo, colorVbo; glGenBuffers(1, &posVbo); glGenBuffers(1, &colorVbo); glBindBuffer(GL_ARRAY_BUFFER, posVbo); glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, colorVbo); glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW); //3 生成vao并且绑定 GLuint vao = 0; glGenVertexArrays(1, &vao); glBindVertexArray(vao); //4 分别将位置/颜色属性的描述信息加入vao当中 //4.1描述位置属性 glBindBuffer(GL_ARRAY_BUFFER, posVbo);//只有绑定了posVbo,下面的属性描述才会与此vbo相关 glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); //4.2 描述颜色属性 glBindBuffer(GL_ARRAY_BUFFER, colorVbo); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glBindVertexArray(0); } void prepareInterleavedBuffer() { //1 准备好Interleaved数据(位置+颜色) float vertices[] = { -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f }; //2 创建唯一的vbo GLuint vbo = 0; GL_CALL(glGenBuffers(1, &vbo)); GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo)); GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW)); //3 创建并绑定vao GLuint vao = 0; GL_CALL(glGenVertexArrays(1, &vao)); GL_CALL(glBindVertexArray(vao)); GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo)); //4 为vao加入位置和颜色的描述信息 //4.1 位置描述信息 GL_CALL(glEnableVertexAttribArray(0)); GL_CALL(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0)); //4.2 颜色描述信息 GL_CALL(glEnableVertexAttribArray(1)); GL_CALL(glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)))); //5 扫尾工作:解绑当前vao glBindVertexArray(0); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。