Post Lists

2018년 11월 25일 일요일

OpenGL Specifiaction 공부 - 키워드 하나씩 정리

- 정리 guidline
버전 -> 상세 목차
내용
=========================================================
- OpenGL3.3 -> 2.8 Vertex Arrays
Vertex data는 server의 address space에 저장되는 배열에 위치한다 (section 2.9에서 설명된다). 이러한 배열들에서 data의 blocks들은 그러고나서 single GL command의 실행을 통해 여러 geometric primitives를 명시하는데 사용될지도 모른다. 클라이언트는 한 개 이상의 generic verteix attributes를 저장하기 위해 MAX_VERTEX_ATTRIBS의 값 까지 명시할지도 모른다. 그 명령어들은

void VertexAttribPointer(uint index, int size, enum type, boolean normalized, sizei stride, const void* pointer);
void VertexAttribIPointer(uint index, int size, enum type, sizei stride, const void* pointer);

이것은 이러한 배열들의 위치와 구성을 설명한다. 각 명령어에 대해, type은 array에 저장되어 있는 값들의 데이터 타입을 명시한다. size는 array에 저장되어 있는 정점당 values의 개수뿐만 아니라 그것들의 컴포넌트 순서를 명시한다. Table 2.5는 size와 type에 대한 (존재할 때) 허용가능한 값들을 명시한다. type에 대해, 그 값들은 BYTE, SHORT, INT, FLOAT, HALF_FLOAT, DOUBLE들은 개별적으로 byte, short, int, float, half, and double을 가리킨다; 그 UNSIGNED_BYTE, UNSIGNED_SHORT, and UNSIGNED_INT는 ubyte, ushort,and uint를 개별적으로 가리킨다; 그리고 INT_2_10_10_10_REV와 UNSIGNED_INT_2_10_10_10_REV 이것들은 4개의 signed or unsigned elements인데, 단위 uint에 packed되어 있고, 둘 다 그 테이블에서 packed 용어와 일치한다.

INVALID_VALUE error는 size가 테이블 2.5에서 대응되는 명령어 값들 중 하나가 아니라면 발생한다.
INVALID_OPERATION 에러는 다음의 조건 중 어떤 것에서 발생한다.



  • size는 BGRA이고, type은 UNSIGNED_BYTE, INT_2_10_10_10_REV or UNSIGNED_INT_2_10_10_10_REV가 아니라면;
  • type은 UNSIGNED_BYTE, INT_2_10_10_10_REV or UNSIGNED_INT_2_10_10_10_REV이고, size가 4 or RGBA 둘 중 하나가 아니라면;
  • VertexAttribPointer에 대해서만, size는 RGBA고 normalized는 false이다;
  • vertex array data의 위치와 구성을 명시하는 *Pointer 명령어중 어떤 것은 zero가 ARRAY_BUFFER object binding point로 바인드 되는 동안 호출되고, 그 poointer argument가 NULL이 아닐 때.
VertexAttribPointer와 VertexAttribIPointer 명령어에 있는 index parameter는 설명되는 generic vertex attribute array를 확인한다. error INVALID_VALUE가 만약 index가 MAX_VERTEX_ATTRIBS의 값보다 크거나 같다면 생성된다. integer type arguments을 가진 Generic attribute arrays 세 가지 방법들 중 하나로 처리될 수 있다: 방정식 2.1과 2.2에서 개별적으로 설명되듯이 [0,1] 또는 [-1, 1]로 표준화하여 float로 변환되는 것; float로 직접적으로 변환되는것, 또는 정수로 남는 것. VertexAttribPointer에 의해 명시되는 한 배열에 대한 데이터는 normalized가 True라면 표준화하여 floating-point로 변환될 것이고, 만약 그렇지 않다면 floating-point로 직접적으로 변환될 것이다. VertexAttribIPointer는 항상 정수 값을 남아 있을 것이다; 그러한 데이터는 pure integers로서 언급된다.

한 array에서 single vertex와 일치하는 한 개, 두 개,세 개, 또는 4개의 값들은 한 array element를 구성한다. size가 BGRA일 때, 그것은 4개의 값들을 가리킨다. 각 array element에 내의 값들은 메모리에 순차적으로 저장된다. 그러나, 만약 size가 BGRA라면, 각 array element의 첫 번째, 두 번째, 세 번째, 네 번째 값들은 메모리에서 개별적으로 세 번째, 두 번째, 첫 번째, 그리고 네 번째 값으로 취해진다. 만약 stride가 zero로 명시된다면, 그러면 array elements들은 순차적으로 또한 저장된다. stride가 음수라면, error INVALID_VALUE가 생성된다. 그렇지 않다면, 한 array의 i번째와 (i + 1)번째 원소에 대한 포인터들은 stride basic machine units에 의해 다르다 (일반적으로 unsigned bytes), (i + 1)번째 원소에 대한 포인터는 더 커진다. 각 명령어에 대해, pointer는 명시된 array의 첫 번째 원소의 첫 번째 값의 한 버퍼 내에서의 offset을 명시한다.

개별 generic vertex attribute array가 다음중 하나를 호출하여 활성화되거나 비활성화 된다

void EnableVertexAttribArray(uint index);
void DisableVertexAttribArray(uint index);

여기에서 index는 활성화하거나 비활성화할 generic vertex attribute array를 말한다. 그 에러 INVALID_VALUE는 index가 MAX_VERTEX_ATTRIBS와 같거나 더 크면 생성된다.

명령어

void VertexAttribDivisor(uint index, uint divisor);

는 generic vertex attributes가 single draw call에서 다양한 primitives의 instances를 렌더링할 때 이동하는 비율을 수정한다. 만약 divisor가 zero라면, slot index에서 그 attribute vertex마다 이동한다. 만약 divisor가 non-zero라면, 그 attribute는 렌더링될 정점들의집합의 divisor instances마다 하나씩 이동한다. 한 attribute는 만약 그것의 divisor value가 non-zero라면, instanced라고 언급된다.

INVALID_VALUE 에러는 index가 MAX_VERTEX_ATTRIBS와 같거나 더 크다면 발생한다.

=========================================================
- OpenGL3.3->2.9.2 Creating Buffer Object Data Stores
다음의 함수를 호출하여 한 buffer object의 data store가 만들어지고 초기화되어진다.

void BufferData(enum target, sizeiptr size, const void* data, enum usage);

target은 table 2.8에 기재된 것들 중 하나로 설정되고,
size는 기본 machine units에서 data store의 크기로 설정되고,
data는 client memory에서 source data를 가리킨다.

만약 data가 non-null이라면, 그러면 그 source data는 buffer object의 data store에 복사된다. 만약 data가 null이라면, 그러면 그 buffer object의 data store의 내용들은 정의되지 않는다.

usage는 9개의 enumerated values중의 하나로서 명시되고, 이것은 data store의 예상되는 application usage pattern을 가리킨다. 그 값들은 :


  • STREAM_DRAW : data store 내용들은 프로그램에 의해서 한 번 명시되고, GL drawing과 image specification commands에 대해 source로서 최대 몇 번 사용될 것이다.
  • STREAM_READ : data store 내용들은 GL로부터 데이터들을 읽어들여서 한 번만 명시될 것이고, 프로그램에 의해 많아봐야 몇 번 쿼리 될 것이다.
  • STREAM_COPY : data store 내용들은 GL로부터 data를 읽어들여 한 번 명시될 것이고, GL drawing과 image specification commands에 대해 source로서 많아봐야 몇 번 사용될 것이다.
  • STATIC_DRAW : data store 내용들은 프로그램에 의해 한 번 명시될 것이고, GL drawing과 image specification commands에 대해 source로서 여러 번 사용될 것이다.
  • STATIC_READ : data store 내용들은 GL로부터 데이터를 읽어들여서 한 번 명시될 것이고, 프로그램에 의해 여러 번 쿼리될 것이다.
  • STATIC_COPY : data store 내용들은 GL로부터 데이터를 읽어들여서 한 번 명시될 것이고, 프로그램에 의해 GL drawing과 image specification commands에 대해 source로서 여러 번 사용될 것이다.
  • DYNAMIC_DRAW : data store 내용들은 프로그램에 의해 반복적으로 재명시될 것이고, GL drawing과 image specification commands에 의해 source로서 여러번 사용될 것이다.
  • DYNAMIC_READ : data store 내용들은 GL에 의해 데이터를 읽어들여 반복적으로 재명시될 것이고, 프로그램에 의해서 여러번 쿼리될 것이다.
  • DYNAMIC_COPY : data store 내용들은 GL로 부터 데이터를 읽어들여 반복적으로 명시될 것이고, GL drawing과 image specification commands를 위해 source로서 여러번 사용될 것이다.

usage는 performance hint로서만 제공된다. 명시된 usage values들은 data store의 실제 사용 패턴을 제한하지 않는다.

BufferData는 어떤 존재하는 data store를 제거하고, buffer object의 state variables을 테이블 2.10에 보여지듯이 그 값으로 설정한다.


클라이언트들은 client platform의 요구사항과 일관되게 데이터 elements들을 정렬시켜야 하는데, 부가적인 base-level 요구사항을 만족시켜야 한다, 거기에서 N개의 basic machine units을 구성하는 한 datum에 대한 offset은 N의 배수가 되어야 한다.

GL이 요구된 사이즈로 data store를 만들 수 없다면, OUT_OF_MEMORY가 생성된다.

buffer object의 data store에 있는 데이터의 몇 가지 또는 모든 것을 수정하기 위해, 그 클라이언트는 다음의 명령어를 사용할지도 모른다

void BufferSubData(enum target, intptr offset, sizeiptr size, const void* data);

target은 table 2.8에 기재된 타겟들 중의 하나로 설정되고, offset과 size는 대체되어야 할 buffer object에서의 data의 범위를 가리키는데, basic machine units의 단위의 관점에서 이다. data는 client memory size의 한 region을 basic machineunits에서 length로 명시하고, 명시된 buffer 범위를 대체할 데이터를 포함한다. INVALID_VALUE error는 offset or size가 zero보다 작거나, offset + size가 BUFFER_SIZE의 값 보다 더 크다면 생성된다. INVALID_OPERATION error는 그 명시된 buffer range의 어떤 부분이 MapBufferRange or MapBuffer (see section 2.9.3)과 mapped되면 발생한다.
=========================================================
- OpenGL3.3->3.8.3 Texture Image Specification
그 명령어

void TexImage3D(enum target, int level, int internalformat,
                        sizei width, sizei height, sizei depth, int border,
                        enum format, enum type, const void* data);

는 3차원 텍스쳐 이미지를 명시하기 위해 사용된다. target은 삼차원 텍스쳐를 위한 TEXTURE_3D 중의 하나이거나, 한 2차원 array texture를 위한 TEXTURE_2D_ARRAY여야만 한다. 부가적으로, target은 3차원 proxy texture를 위한 PROXY_TEXTURE_3D 이거나, section 3.8.15에서 이야기 되었듯이, 2차원 proxy array texture를 위한 PROXY_TEXTURE_2D 둘 중 하나 일지도 모른다. format, type, 그리고 data는 image data의 format, 그러한 데이터의 type, 그리고 section 3.7.2에서 이야기 되었듯이 현재 바운드된 pixel unpack buffer or client memory에서의 image data에 대한 reference를 명시한다. format STENCIL_INDEX는 허용되지 않는다.

메모리에서 groups는 인접한 rectangles의 sequence로 배치되듯이 다뤄진다. 각 rectangle은 2차원 image이고, 그것의 size와 구성은 TexImage3Dwidthheight 파라미터로 명시된다. UNPACK_ROW_LENGTH와 UNPACK_ALIGNMENT의 값들은 이러한 이미지에서 섹션 3.7.2에서 설명되듯이 row-to-row spacing을 조절한다. 만약 그 정수 파라미터 UNPACK_IMAGE_HEIGHT의 값이 양수가 아니라면, 각 2차원 이미지에서 행의 개수는 height가 된다; 만약 그렇지 않다면, 행의 개수는 UNPACK_IMAGE_HEIGHT이다. 각 2차원 이미지는 행의 정수 개수로 구성되어있고, 정확히 그것의 이웃 이미지와 인접해있따.

삼차원 이미지의 sub-volume을 선택하는 메커니즘은 정수 파라미터 UNPACK_SKIP_IMAGES에 의존한다. 만약 UNPACK_SKIP_IMAGES가 양수라면, 그 포인터는 UNPACK_SKIP_IMAGES 곱하기 한 2차원 이미지에서 원소들의 개수만큼 이동한다, 메모리로부터 첫 번째 그룹이 얻어지기 전에. 그러고나서 depth깊이의 2차원 이미지가 처리되고, 각각은 section 3.7.2에서 설명되었듯이, 추출된 subimage를 갖는다.

그 선택된 그룹들은 section 3.7.2에서 설명되었듯이, GL에 보내지고, 그러고나서 internal format의 표현가능한 범위로 clamped 된다. 만약 그 텍스쳐의 internalformat이 signed or unsigned integer라면, 컴포넌트들은 [-2^(n-1), 2^(n-1) -1] or [0, 2^n -1]로 개별적으로 clamped 된다. 거기에서 n은 컴포넌트당 비트의 개수이다. color component groups에 대해, 만약 texture의 internalformat이 signed or unsigned normalized fixed-point라면, 컴포넌트들은 [-1, 1] 또는 [0, 1]로 각각 clamped 된다. 만약 그렇지 않다면 values는 수정되지 않는다. Stencil index values는 2^n -1로 masked되고, n은 internal format resolution에서 stencil bits의 개수이다 (see below). 만약 base internal format이 DEPTH_STENCIL이고 format이 DEPTH_STENCIL이 아니라면, 그러면 stencil index texture components의 값들은 정의되지 않는다.

컴포넌트들은 그러고나서 최종 R, G, B, A, depth, or stencil values로부터 internalformat에 의해 명시된 (또는 얻어진) base internal format을 가진 texture를 얻기위해 선택된다. Table 3.11은 R, G, B, A, depth, or stencil values의 texture components로의 매핑을 요약한다. 그것은 텍스쳐 이미지의 base internal format의 함수이다. internalformat은 테이블 3.11에 열거된 internal for
mat symbolic constants중 하나, 테이블 3.12 ~ 3.13에 열거된 sized internal format symbolic constants중의 하나, 테이블 3.14에 열거된 generic compressed internal format symbolic constants들 중 하나, 또는 (만약 테이블 3.14에 열거되어있다면) specific compressed internal format symbolic constants들 중의 하나로 명시될지도 모른다. 위의 값들 중의 하나가 아닌 것으로 internal format에 대한 한 값을 명시하는 것은 INVALID_VALUE를 발생시킨다.

DEPTH_COMPONENT or DEPTH_STENCIL의 base internal format을 가진 텍스쳐들은 만약 target이 TEXTURE_1D, TEXTURE_2D, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_RECTANGLE, TEXTURE_CUBE_MAP, PROXY_TEXTURE_1D, PROXY_TEXTURE_2D, PROXY_TEXTURE_1D_ARRAY, PROXY_TEXTURE_2D_ARRAY, PROXY_TEXTURE_RECTANGLE, or PROXY_TEXTURE_CUBE_MAP이라면 texture image specification commands로만 지원된다.

DEPTH_COMPONENT or DEPTH_STENCIL의 base internal format을 가진 텍스쳐들은 depth component data or depth/stencil component data둘 중 하나를 요구한다. 다른 base internal formats을 가진 텍스쳐들은 RGBA component data를 요구한다. base internal format중의 하나와 format이 DEPTH_COMPONENT or DEPTH_STENCIL이고, 다른 것이 이러한 값들이 아니라면, INVALID_OPERATION이 발생한다.

integer internal formats을(see table 3.12) 가진 텍스쳐들은 integer data를 요구한다. internal format이 integer이고, format이 table 3.3에 열거된 integer formats들 중 하나가 아니라면, INVALID_OPERATION이 발생한다; 또는 만약 format이 integer format이고, type이 FLOAT, HALF_FLOAT, UNSIGNED_INT_10F_11F_11F_REV or UNSIGNED_INT_5_9_9_9_REV 라면.

table 3.14에 열거된 specific compressed internal formats외에도, GL은 extensions에 의해 제공되는 모든 그러한 formats들에 대한 토큰 값을 얻는 메커니즘을 제공한다.





















=========================================================

댓글 없음:

댓글 쓰기