IntBuffer VBO = IntBuffer.allocate(4);
gl.glGenBuffers(1, VBO);
...
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBOHandle);
gl.glBufferData(GL.GL_ARRAY_BUFFER, fb.capacity() * Buffers.SIZEOF_FLOAT, fb,GL.GL_STATIC_DRAW);
위 코드는 4바이트 Int Buffer 공간을 만들고 (!개의 정수) 이 공간에 GenBuffers의 핸들 값을 할당받는다. 버퍼는 우선 한 개만 삽입할 것이므로, 개수는 1로 지정하였다. 그리고 GL.GL_ARRAY_BUFFER 옵션을 통해 VBO 핸들에 대해서 작업한다고 명시하고 (VBOHandle은 VBO IntBuffer의 get 한 값이다.) 이 명시된 공간에 실제 fb라는 데이터를 복사한다. 그 과정에서 실제 바이트 크기를 넘겨야하는데 정점 정보는 모두 실수이므로, 정점 개수 * float 데이터 형 크기로 넘겨야한다. 즉 전체 소스로 보면 다음과 같다.
IntBuffer VAO = IntBuffer.allocate(4);
gl.glGenVertexArrays(1, VAO);
int VAOHandle = VAO.get();
이렇게 만들어진 VAO 핸들 공간에 Binding 해주고, 어떤 VBO Handle 인지 명시해준다.
gl.glBindVertexArray(VAOHandle);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBOHandle);
그리고 이제 실제 어떤 규칙의 데이터인지 명시를해야하는데, 이는 glVertexAttribPointer을 사용해서 명시할 수 있다.
gl.glVertexAttribPointer(0, 2, GL.GL_FLOAT, false, 4 * Buffers.SIZEOF_FLOAT, 0);
gl.glEnableVertexAttribArray(0);
먼저 첫 번째 인자는 Layout 넘버(인덱스)이므로 0번으로 할당한다. 이는 추후 쉐이더에 넘길 때 사용된다. 다음으로는 개수(size)인데, x,y 2개가 한 개의 정점 좌표를 의미하므로 2를 입력한다. 다섯 번째 인자에는 Stride 간격을 넣는데 주의할 점은 bytes 단위로 넣어야한다. 즉 시작 지점에서부터 4 float 뒤에 다시 다음 2개의 정점 좌표가 오기 때문에, 4 * float_data_size 크기로 넣어야 한다. 따라서 나는 4* Buffers.SIZEOF_FLOAT 로 기입하였다. 결과적으로는 16바이트마다 반복되는 것 이다. 마지막 인자는 시작 바이트 위치인데, 정점 좌표는 제일 앞에서부터 기입했으므로 0바이트를 넣는다.
gl.glVertexAttribPointer(1, 2, GL.GL_FLOAT, false, 4 * Buffers.SIZEOF_FLOAT, 2* Buffers.SIZEOF_FLOAT);
gl.glEnableVertexAttribArray(1);
한편 TexCoord 의 경우는 버텍스 x,y 2개(정점 한개)가 나온 뒤에서야 TexCoord가 반복된다. 사이즈는 그대로 2이고, Stride 간격도 역시 16바이트(TexCoord 시작으로부터 4개 정점 이후)이나, 시작 위치는 비로소 2번째 인덱스부터 시작되기 때문에 2 * Buffers.SIZEOF_FLOAT 로 8바이트 오프셋 부터로 정의한다. TexCoord는 1번 레이아웃으로 지정하였다.
렌더
렌더링할 때는 이제 VAO 정보만 있으면 된다. VAO 핸들만 있으면 이미 초기화단계에서 모두 명시하고 참조해두었기 때문에, 그리는 방법과 총 최종 정점의 개수만 있으면 된다.
gl.glBindVertexArray(vaoA);
gl.glDrawArrays(GL2.GL_QUADS, 0, 4);
이 상태에서 정상적으로 QUADS 가 출력됨을 확인할 수 있었다.
int uniformLoc = gl.glGetUniformLocation(shader, "tex");
gl.glUniform1f(uniformLoc, textureID);
textureID 는 텍스처를 로드하고 나오는 핸들 값을 의미한다. 이 부분은 텍스처 로드에 관련하여 작성한 일지를 참고하길 바란다.