[OpenGL ES] 14. Drawing, Render에 대해서

[OpenGL ES] 14. Drawing, Render에 대해서


OpenGL ES Drawing

OpenGL ES에서 그리기는 2개의 함수로 이루어져 있다.


Clearing the Render Buffers


GLvoid glDrawArrays(GLenum mode, GLint first, GLsizei count)


mode: This parameter specify which primitive will be rendered and how its structure is organized. This parameter can be:


GL_POINTS: OpenGL ES Draw points. Points are composed by single sequences of 3 values (x,y,z).

GL_LINES: Draw Lines. Lines are composed by two sequences of 3 values (x,y,z / x,y,z).

GL_LINE_STRIP: Draw Lines forming a strip. Lines are composed by two sequences of 3 values (x,y,z / x,y,z).

GL_LINE_LOOP: Draw Lines closing a loop of them. Lines are composed by two sequences of 3 values (x,y,z / x,y,z).

GL_TRIANGLES: Draw Triangles. Triangles are composed by three sequences of 3 values (x,y,z / x,y,z / x,y,z).

GL_TRIANGLE_STRIP: Draw Triangles forming a strip. Triangles are composed by three sequences of 3 values (x,y,z / x,y,z / x,y,z).

GL_TRIANGLE_FAN: Draw Triangles forming a fan. Triangles are composed by three sequences of 3 values (x,y,z / x,y,z / x,y,z).


first: 활성화된 OpenGL ES vertex array의 시작 index.


count: 그릴 꼭지점의 개수. 이거 중요함. vertex array 요소 개수가 아니라, 꼭지점 요소의 개수임. 헷갈리지 마라.


예를 들어 당신이 OpenGL ES 삼각형 한 개를 그리면 이 값은 3이다. 왜냐면 삼각형은 3개의 꼭짓점으로 되어 있으니까, 당신이 사각형을 하나 그리면(2개의 삼각형으로 구성된) 이값은 6이다. 왜냐면 삼각형 2개니깐.


OpenGL ES Drawing[[OpenGL ES] 14. Drawing, Render에 대해서]


GLvoid glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)


mode: This parameter specify which primitive will be rendered and how its structure is organized. This parameter can be:

GL_POINTS: OpenGL ES Draw points. Points are composed by single sequences of 3 values (x,y,z).

GL_LINES: Draw Lines. Lines are composed by two sequences of 3 values (x,y,z / x,y,z).

GL_LINE_STRIP: Draw Lines forming a strip. Lines are composed by two sequences of 3 values (x,y,z / x,y,z).

GL_LINE_LOOP: Draw Lines closing a loop of them. Lines are composed by two sequences of 3 values (x,y,z / x,y,z).

GL_TRIANGLES: Draw Triangles. Triangles are composed by three sequences of 3 values (x,y,z / x,y,z / x,y,z).

GL_TRIANGLE_STRIP: Draw Triangles forming a strip. Triangles are composed by three sequences of 3 values (x,y,z / x,y,z / x,y,z).

GL_TRIANGLE_FAN: Draw Triangles forming a fan. Triangles are composed by three sequences of 3 values (x,y,z / x,y,z / x,y,z).


count: Represents number of vertices to be draw. This is very important, it represents the number of vertices elements, not the number of the OpenGL ES elements in the array of vertices, take care to don't confuse both. For example, if you are drawing a single triangle this should be 3, because a triangle is formed by 3 vertices. But if you are drawing a square (composed by two triangles) this should be 6, because is formed by two sequences of 3 vertices, a total of 6 elements, and so on.


type: Represent the OpenGL ES data type which is used in the array of indices. This parameter can be:

GL_UNSIGNED_BYTE: To indicate a GLubyte.

GL_UNSIGNED_SHORT: To indicate a GLushort.


많은 질문이 있을 것이다.


먼저 저 위의 함수들이 어떻게 동작하는지 설명한다. programmable pipeline의 가장 중요한 점 중 하나는, vsh가 실행될 회수다.


OpenGL ES Render[[OpenGL ES] 14. Drawing, Render에 대해서]


count 파라미터에 의해서 정해지는데, 만약 128을 넣었다면 현재 사용 중인 OpenGL ES program은 vsh를 128번 실행시킨다. 물론 gpu가 가능한 최대로 최적화하겠지만 vsh는 어쨌든 128번 처리된다(그 안의 모든 attribute와 uniform들까지).


그리고 내가 꼭지점 요소의 개수와 꼭지점 배열의 요소 개수의 차이점에 대해서 주의 깊게 설명한 이유를 알겠는가?


간단히 말해 당신이 꼭지점 배열과 그 배열에 200개의 요소를 갖고 있는데, 어떤 이유로 3개의 OpenGL ES 삼각형만 만들고 싶길 원한다면 count에 3을 주면 된다. 이것은 index 배열을 사용하는 것 보다 유용할 수 있다.


결론적으로 count 인자는 당신이 그리고 싶은 꼭지점 요소의 개수를 나타낸다. glDrawArrays를 사용한다면 first 변수에 배열에서 시작할 첫 번째 요소의 순서를 적어주면 된다.


glDrawElements를 사용한다면 index 배열에서 시작할 첫 번째 요소의 순서를 적어주면 된다.


OpenGL ES, primitives_lines_strip_example[[OpenGL ES] 14. Drawing, Render에 대해서]


위의 그림은 우리가 선을 그릴 때, 옵션별 진행 과정을 나타낸다. 모든 경우에 꼭지점 배열은 {v0,v1,v2,v3,v4,v5}와 같이 구성되며 x, y, z의 좌표는 고유한 값을 갖고 있다.


이전에 내가 말했지만, GL_LINES는 다른 모드와도 호환이 되며 일부 특수한 상황에서 최적화된 유형이다. OpenGL ES, GL_LINES는 3개의 선, GL_LINE_STRIP는 5개의 선, GLLINE_LOOP는 6개의 선을 그린다.


OpenGL ES, primitives_strip_example[[OpenGL ES] 14. Drawing, Render에 대해서]


위의 그림은 우리가 삼각형을 그릴 때, 옵션별 진행 과정을 나타낸다.


여기서도 비슷하다. GL_TRIANGLES가 메쉬나 다른 모드와도 호환할 수 있으며 일부 특수한 상황에서 최적화된 유형이다.


GL_TRIANGLES_STRIP을 사용 : {0,1,2, 0,2,3, 3,2,4,...}과 같은 인덱스 배열을 사용해 꼭지점 배열을 다시 형성해야 함.


GL_TRIANGLES_FAN을 사용 : {0,1,2, 0,2,3, 0,3,4,...}와 같이 첫 번째 꼭지점으로 돌아옴.


내가 조언을 하자면, 되도록 OpenGL ES, GL_TRIANGLES와 GL_LINES를 사용하라.


Render

Render는 화면에 보이는 frame buffer의 최종 결과를 보여준다(비록 frame buffer를 분명히 알고 사용하지 못하더라도).


presentRenderbuffer 함수를 호출하기 전에, color render buffer를 bind 해야만 하고, frame buffer도 bind 해야 한다. 왜냐면 render buffer는 frame buffer 안에 있기 때문이다.


1
2
3
4
5
6
- (void) makeRender
{
    glBindFramebuffer(_framebuffer);
    glBindRenderbuffer(_colorRenderbuffer);
    [_context presentRenderbuffer:GL_RENDERBUFFER];
}
cs


EGL_API를 사용한다면 glSwapBuffers 함수를 사용해서 내부버퍼를 swap 할 수 있다.


OpenGL ES는 Multisample이라는 것도 제공하는데 이것은 anti-aliased 이미지를 위한 것이다.


출처 : All About OpenGL ES 2.X 번역

[OpenGL ES] 14. Drawing, Render에 대해서

이 글을 공유하기

댓글(0)

Designed by JB FACTORY