Opengl之图元重启动
triangles.vert
#version 330 layout (location = 0) in vec4 position; layout (location = 1) in vec4 color; out vec4 vs_fs_color; void main(void) { vs_fs_color = color; gl_Position = position; }triangles.frag
#version 330 in vec4 vs_fs_color; layout (location = 0) out vec4 color; void main(void) { color = vs_fs_color; }实现程序:
#include "stdafx.h" #include<iostream> using namespace std; #include "vgl.h" #include "LoadShaders.h" #include "vmath.h" enum ebo_IDs{ Arrayebo, Numebo }; GLuint ebo[Numebo]; enum vao_IDs{ Arrayvao, Numvao }; GLuint vao[Numvao]; enum vbo_IDs{ Arrayvbo, Numvbo }; GLuint vbo[Numvbo]; GLint render_model_matrix_loc; void init() { //设置立方体的8个角点,边长为2,中心为原点 static const GLfloat cube_positions[] = { -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, }; //每个顶点的颜色 static const GLfloat cube_colors[] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, }; //三角形条带的索引 static const GLushort cube_indices[] = { 0, 1, 2, 3, 6, 7, 4, 5, //第一组条带 0xFFFF, //<<--这是重启动的索引 2, 6, 0, 4, 1, 5, 3, 7, //第二组条带 }; //设置元素数组缓存 glGenBuffers(1, ebo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo[Arrayebo]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_indices), cube_indices, GL_STATIC_DRAW); //设置顶点属性 glGenVertexArrays(1, vao); glBindVertexArray(vao[Arrayvao]); glGenBuffers(1, vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo[Arrayvbo]); glBufferData(GL_ARRAY_BUFFER, sizeof(cube_positions)+sizeof(cube_colors), NULL, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(cube_positions), cube_positions); glBufferSubData(GL_ARRAY_BUFFER, sizeof(cube_positions), sizeof(cube_colors), cube_colors); ShaderInfo shaders[] = { { GL_VERTEX_SHADER, "triangles.vert" }, { GL_FRAGMENT_SHADER, "triangles.frag" }, { GL_NONE, NULL } }; GLuint PRogram = LoadShaders(shaders); glUseProgram(program); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)sizeof(cube_positions)); glEnableVertexAttribArray(1); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); //设置使用glDrawElements glBindVertexArray(vao[Arrayvao]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo[Arrayebo]); #if USE_PRIMITIVE_RESTART //如果开启了图元重启动,那么只需要一次绘制命令 glEnable(GL_PRIMITIVE_RESTART); glPrimitiveRestartIndex(0xFFFF); glDrawElements(GL_TRIANGLE_STRip, 17, GL_UNSIGNED_SHORT, NULL); #else //如果没有开启图元重启动,那么需要调用两次绘制命令 glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_SHORT, NULL); glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_SHORT, (const GLvoid *)(9 * sizeof(GLushort))); #endif glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(512, 512); glutInitContextVersion(3, 3); glutCreateWindow(argv[0]); glewExperimental = GL_TRUE; if (glewInit()) { cerr << "Unable to initialize GLEW ... exiting" << endl; exit(EXIT_FAILURE); } init(); glutDisplayFunc(display); glutMainLoop(); }