정점 버퍼 객체
Vertex buffer object![]() |
정점 버퍼 객체(VBO)는 즉시 모드 렌더링을 위해 정점 데이터(위치, 정상 벡터, 색상 등)를 비디오 장치에 업로드하는 방법을 제공하는 OpenGL 기능이다.VBO는 주로 데이터가 시스템 메모리가 아닌 비디오 장치 메모리에 상주하기 때문에 비디오 장치에 의해 직접 렌더링될 수 있기 때문에 즉각적인 모드 렌더링에 비해 상당한 성능 이득을 제공한다.이것들은 Direct3D의 꼭지점 버퍼와 동등하다.
정점 버퍼 객체 규격은 OpenGL 버전 1.5(2003년)를 기준으로 OpenGL 아키텍처 검토 위원회에 의해 표준화되었다.Nvidia에서 만든 확장자 "Vertex 어레이 범위"[1] 또는 ATI의 "Vertex 어레이 개체"[2] 확장을 통해 VBO를 표준화하기 전에 유사한 기능을 사용할 수 있었다.
기본 VBO 기능
VBO 액세스 및 조작의 핵심을 이루는 기능은 다음과 같다.
- OpenGL 1.4의 경우:
- glGenBuffersARB(sizei n, uint *버퍼)
- 새 VBO를 생성하고 서명되지 않은 정수로 ID 번호를 반환함0번 아이디는 예약되어 있다.
- GlBindBufferARB(enum target, uint buffer)
- 이전에 생성한 버퍼를 활성 VBO로 사용하십시오.
- glBufferDataARB(enum target, sizeiptr)ARB 크기, const 보이드 *data, 열거형 사용량)
- 데이터를 활성 VBO로 업로드하십시오.
- glDeleteBuffersARB(sizei n, const uint *buffers)
- 제공된 어레이 또는 VBO ID에서 지정된 수의 VBO를 삭제하십시오.
- OpenGL 2.1,[3] OpenGL 3.x[4] 및 OpenGL 4.x의 경우:[5]
- glGenBuffers(sizei n, uint *buffers)
- 새 VBO를 생성하고 서명되지 않은 정수로 ID 번호를 반환함0번 아이디는 예약되어 있다.
- GlBindBuffer(enum target, uint buffer)
- 이전에 생성한 버퍼를 활성 VBO로 사용하십시오.
- glBufferData(enum target, sizeiptr)ARB 크기, const 보이드 *data, 열거형 사용량)
- 데이터를 활성 VBO로 업로드하십시오.
- glDeleteBuffers(sizei n, const uint *buffers)
- 제공된 어레이 또는 VBO ID에서 지정된 수의 VBO를 삭제하십시오.
사용 예
C에서 OpenGL 2.1 사용
//VBO 초기화 - 프로그램 시작 시 한 번만 실행 //VBO 식별자를 고정할 변수 생성 글루인트 삼각VBo; //삼각형의 수직(시계 반대 방향) 둥둥 뜨다 자료[] = {1.0, 0.0, 1.0, 0.0, 0.0, -1.0, -1.0, 0.0, 1.0}; //float data[] = {0.0, 1.0, -1.0, -1.0, 0.0, -1.0, -1.0, 0.0, -1.0, 0.0}; 위의 항목이 작동하지 않는 경우. //새 VBO를 생성하고 변수 ID를 사용하여 VBO ID를 저장하십시오. glGenBuffers(1, &삼각VBo); //새 VBO 활성화 글빈드부퍼(GL_ARRE_BUFFER, 삼각VBo); //정점 데이터를 비디오 장치에 업로드 glBufferData(GL_ARRE_BUFFER, 의 크기(자료), 자료, GL_STATIC_DRAW); //새 VBO를 활성화하십시오.초기화 후 변경된 경우를 가정하여 이 과정을 반복하십시오. 글빈드부퍼(GL_ARRE_BUFFER, 삼각VBo); //VBO에서 삼각형 그리기 - 매 시간 창, 점 보기 또는 데이터 변경 수행 // 이 배열에서 보폭을 0으로 하여 정점당 3개의 좌표 설정, 여기에서 필요 glVertexPointer(3, GL_FLOAT, 0, NULL); //배열이 정점을 포함하도록 설정(노멀, 색상, 텍스처 좌표 등 아님) glEnableClientState(GL_VERTEX_ARRE); //실제로 삼각형을 그리며, 제공된 정점 수를 표시 GlrawArrays(GL_TRIANGLES, 0, 의 크기(자료) / 의 크기(둥둥 뜨다) / 3); //지금 디스플레이를 강제로 그리십시오. 글플루시();
C에서 OpenGL 3.x 및 OpenGL 4.x 사용
정점 셰이더:
/*---------------------------------------------------*/ "예:VertexShader.vert" #버전 150 // 사용 중인 GLSL 버전을 지정하십시오. // in_Position이 속성 색인 0("shaderAttribute")에 바인딩됨 에 vec3 in_Position; 공허하게 하다 본래의() { gl_위치 = vec4(in_Position.x, in_Position.y, in_Position.z, 1.0); } /*--------------------------------------------------------------*/
조각 셰이더:
/*-----------------------------------*/ "예:FragmentShader.frag" -------/ #버전 150 // 사용 중인 GLSL 버전을 지정하십시오. 정밀한 하이프 둥둥 뜨다; // 비디오 카드 드라이버에서 이 라인이 올바르게 작동해야 함 밖으로 vec4 프래그컬러; 공허하게 하다 본래의() { 프래그컬러 = vec4(1.0,1.0,1.0,1.0); //각 조각의 색상을 화이트로 설정 } /*--------------------------------------------------------------*/
메인 OpenGL 프로그램:
/*----------------------------------------------------------/ /* VBO 식별자를 고정할 변수 생성 */ 글루인트 삼각VBo; /* 이것은 쉐이더 프로그램의 핸들 */ 글루인트 셰이더 프로그램; /* 이 포인터들은 쉐이더 소스 코드 파일의 내용을 수신할 것이다 */ 글래커 *꼭지점 원본, *조각 출처; /* 쉐이더를 참조하는 데 사용되는 핸들 */ 글루인트 꼭지점 셰이더, 파편 셰이더; 경시하다 서명이 없는 인트로 셰이더애트리뷰트 = 0; /* 삼각형의 정점(시계 반대 방향) */ 둥둥 뜨다 자료[3][3] = { { 0.0, 1.0, 0.0 }, { -1.0, -1.0, 0.0 }, { 1.0, -1.0, 0.0 } }; /*---------------------------------- VBO 초기화 - (주: 프로그램 시작 시 한 번만 실행) ----------------*/ /* 새 VBO를 생성하고 "triangleVB" 변수를 사용하십시오.VBO ID */를 저장하는 O" glGenBuffers(1, &삼각VBo); /* 새 VBO 활성화 */ 글빈드부퍼(GL_ARRE_BUFFER, 삼각VBo); /* 비디오 장치에 정점 데이터 업로드 */ glBufferData(GL_ARRE_BUFFER, 의 크기(자료), 자료, GL_STATIC_DRAW); /* 좌표 데이터가 계수 지수 0(ShaderAttribute)으로 들어가고 정점당 3개의 부동치를 포함하도록 지정 */ glVertexAttribPointer(셰이더애트리뷰트, 3, GL_FLOAT, GL_FALSE, 0, 0); /* 속성 인덱스 0(shaderAttribute)을 사용 중인 것으로 활성화 */ glEnableVertexAttribArray(셰이더애트리뷰트); /* 새 VBO를 활성화하십시오.*/ 글빈드부퍼(GL_ARRE_BUFFER, 삼각VBo); /*-------------------------------------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------------------/ /* 쉐이더를 적절한 버퍼로 읽어보십시오 */ 꼭지점 원본 = 파일토부프("예:VertexShader.vert"); 조각 출처 = 파일토부프("예:FragmentShader.frag"); /* 새로운 쉐이더 객체에 "이름"을 핸들에 할당 */ 꼭지점 셰이더 = glCreateShader(GL_VERTEX_ShADER); 파편 셰이더 = glCreateShader(GL_FRagment_ShADER); /* 소스 코드 버퍼를 각 핸들과 연결 */ glShaderSource(꼭지점 셰이더, 1, (경시하다 글래커**)&꼭지점 원본, 0); glShaderSource(파편 셰이더, 1, (경시하다 글래커**)&조각 출처, 0); /* 임시로 할당된 메모리를 확보하십시오. */ 무료의(꼭지점 원본); 무료의(조각 출처); /* 쉐이더 객체 컴파일 */ glCompileShader(꼭지점 셰이더); glCompileShader(파편 셰이더); /*-------------------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------*/ /* 프로그램 핸들 "이름" 지정 */ 셰이더 프로그램 = glCreateProgram(); /* 프로그램에 쉐이더 부착 */ glattachShader(셰이더 프로그램, 꼭지점 셰이더); glattachShader(셰이더 프로그램, 파편 셰이더); /* 속성 인덱스 0(shaderAttribute)을 in_Position*/에 바인딩 /* "in_Position"은 꼭지점 셰이더에 "데이터" 배열의 내용을 나타냄 */ glBindAttribLocation(셰이더 프로그램, 셰이더애트리뷰트, "in_Position"); /* 링크 셰이더 프로그램*/ glLinkProgram(셰이더 프로그램); /*-------------------------------------------------------------------------------------------------------*/ /* 쉐이더 프로그램을 적극적으로 사용하는 것으로 설정 */ gluseProgram(셰이더 프로그램); /* 배경색을 검은색 */로 설정 glClear Color(0.0, 0.0, 0.0, 1.0); /* 검은색 바탕 */ 글클리어(GL_COLOR_BUFFER_BIT); /* 실제로 삼각형을 그려 glDrawArray를 호출하여 정점 수를 제공함 우리의 데이터가 삼각형이고 우리는 0-3 꼭지점을 그리기를 원한다. */ GlrawArrays(GL_TRIANGLES, 0, (의 크기(자료) / 3) / 의 크기(GL플로트)); /*---------------------------------------------------------------*/