그리고 EBO + VAO + VBO를 사용하여 정점 좌표를 인덱싱하여 순서를 변경 합니다.
위에 헤더의 indices를 주목해 주세요.
0~4 사이의 순서를 변경하면 LINE_STRIP 그리는 위치가 바뀌게 됩니다.
voidRenderEBO_VAO_VBO::GlInit(){
/***************************************************************************************
* VAO + VBO 1번째
**************************************************************************************/// VAO 생성 및 바인딩glGenVertexArrays(1, &VAO); // 1.할당 (앞에 인자는 1개 의미)glBindVertexArray(VAO);
// VBO// 1. Gen(할당) -> 2. Bind(바인딩) -> 3. Data(입력) -> 4. Link 순서로 사용glGenBuffers(1, &VBO); // 1.할당 (앞에 인자는 1개 의미)glBindBuffer(GL_ARRAY_BUFFER, VBO); // 2. GL_ARRAY_BUFFER 형식 바인딩 (이 버퍼 말고도 종류가 많음)glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STREAM_DRAW); // 3.데이터 복사 및 크기 설정///GL_STATIC_DRAW: 데이터가 거의 변하지 않습니다.///GL_DYNAMIC_DRAW: 데이터가 자주 변경됩니다.///GL_STREAM_DRAW: 데이터가 그려질때마다 변경됩니다.// 4. Link Vertex Attributeint location = 0;
glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GL_FLOAT), (void*)0);
glEnableVertexAttribArray(location);
/***************************************************************************************
* VAO + VBO 2번째
**************************************************************************************/// VAO 생성 및 바인딩glGenVertexArrays(1, &VAO2); // 1.할당 (앞에 인자는 1개 의미)glBindVertexArray(VAO2); // VAO를 OpenGL context에 연결(bind)// VBO// 1. Gen(할당) -> 2. Bind(바인딩) -> 3. Data(입력) -> 4. Link 순서로 사용glGenBuffers(1, &VBO2); // 1.할당 (앞에 인자는 1개 의미)glBindBuffer(GL_ARRAY_BUFFER, VBO2); // 2. GL_ARRAY_BUFFER 형식 바인딩 (이 버퍼 말고도 종류가 많음)glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STREAM_DRAW); // 3.데이터 복사 및 크기 설정///GL_STATIC_DRAW: 데이터가 거의 변하지 않습니다.///GL_DYNAMIC_DRAW: 데이터가 자주 변경됩니다.///GL_STREAM_DRAW: 데이터가 그려질때마다 변경됩니다.// 4. Link Vertex AttributeglVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GL_FLOAT), (void*)0);
glEnableVertexAttribArray(location);
/***************************************************************************************
* EVO + VAO + VBO
**************************************************************************************/// VAO 생성 및 바인딩glGenVertexArrays(1, &VAO3); // 1.할당 (앞에 인자는 1개 의미)glBindVertexArray(VAO3); // VAO를 OpenGL context에 연결(bind)// VBO// 1. Gen(할당) -> 2. Bind(바인딩) -> 3. Data(입력) -> 4. Link 순서로 사용glGenBuffers(1, &VBO3); // 1.할당 (앞에 인자는 1개 의미)glBindBuffer(GL_ARRAY_BUFFER, VBO3); // 2. GL_ARRAY_BUFFER 형식 바인딩 (이 버퍼 말고도 종류가 많음)glBufferData(GL_ARRAY_BUFFER, sizeof(vertices3), vertices3, GL_STREAM_DRAW); // 3.데이터 복사 및 크기 설정// OpenGL이 사용하기 위해 인덱스 리스트를 element 버퍼에 복사glGenBuffers(1, &EBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STREAM_DRAW);
///GL_STATIC_DRAW: 데이터가 거의 변하지 않습니다.///GL_DYNAMIC_DRAW: 데이터가 자주 변경됩니다.///GL_STREAM_DRAW: 데이터가 그려질때마다 변경됩니다.// Link Vertex AttributeglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
}
voidRenderVBO::GlInit(){
// 1. Gen(할당) -> 2. Bind(바인딩) -> 3. Data(입력) -> 4. Link 순서로 사용glGenBuffers(1, &VBO); // 1.할당glBindBuffer(GL_ARRAY_BUFFER, VBO); // 2. GL_ARRAY_BUFFER 형식 바인딩 (이 버퍼 말고도 종류가 많음)glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) /* Byte 크기*/ , &vertices[0], GL_STREAM_DRAW); // 3.데이터 복사 및 크기 설정///GL_STATIC_DRAW: 데이터가 거의 변하지 않습니다.///GL_DYNAMIC_DRAW: 데이터가 자주 변경됩니다.///GL_STREAM_DRAW: 데이터가 그려질때마다 변경됩니다.// 4. Link Vertex Attributeint location = 0;
// 파라미터 : location, 크기, 데이터 형태(float 등), Normalize 여부, 한점 BYTE 크기 (0이면 자동 계산), 시작 인덱스glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GL_FLOAT), (void*)0);
glEnableVertexAttribArray(0);
}
VBO를 사용하기 위해서는 아래순서로 사용합니다. 꼭 기억해두세요.
1. Gen(할당) -> 2. Bind(바인딩) -> 3. Data(입력) -> 4. Link 순서로 사용
voidRenderVBO::GlDraw(){
glViewport(0, 0, gl_window_width, gl_window_height);
glLoadIdentity();
glOrtho((double)-gl_window_width / 2, (double)gl_window_width / 2,
(double)-gl_window_height / 2, (double)gl_window_height / 2,
1, -1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0, 0, 0, 0);
glColor4f(0, 1, 0, 1);
// 중요! 단독으로 VBO만 사용시 VBO버퍼에 마지막으로 입력된 데이터가 출력됨// 만약 여러 데이터를 입력하려면 VAO를 같이 사용해야 함(다음 예제 참조)glDrawArrays(GL_LINES, 0, 2); // glBegin(GL_LINES); 처럼 쓰면됨 GL_POINTS 등등
}