Post Lists

2018년 12월 3일 월요일

glTexImage2D 설명

https://stackoverflow.com/questions/34497195/difference-between-format-and-internalformat#comment56736641_34497470

여기에서 두 번째 답변이 좀 더 이해가 잘 된다. 그걸 번역하도록 하겠다.

internal format은 텍스쳐가 GPU에서 어떻게 저장 될지를 설명한다.
format은 client memory에서 너의 pixel data가 어떻게 저장될지를 설명한다 (type parameter와 함께)

internal format이 data type뿐만 아니라 채널의 개수 (1에서 4) 둘 다 명시한다는 것에 주목해라, 반면에 클라이언트 메모리에서 pixel data에 대해, 둘 다 두 개의 별개의 파라미터로 명시된다.

GL은 너의 pixel data를 internal format으로 변경할 것이다. 만약 너가 효율적인 texture uploads를 원한다면, 너는 어떠한 변환이 필요하지 않은 matching formats을 사용해야만 한다. 그러나 대부분의 GPU들이 텍스쳐 데이터를 BGRA 순서로 저장한다는 것을 인지해라. 이것은 여전히 internal format GL_RGBA에 의해 표현된다 - 그 internal format은 채널이ㅡ 개수와 data type을 설명하기만 하고, 그 internal layout은 전적으로 GPU-specific이다. 그러나, 그것은 클라이언트 메모리에서 너의 픽셀 데이터 포맷으로 GL_BGRA를 사용하는 것이 최대 성능을 위해 추천된다.

첫 번째 internalFormat은 GL에게 그것이 텍스쳐를 선호되는 precision에서 (채널 당 8비트) 표준화되는 정수를 저장해야 한다고 말한다. 두 번째 format은 GL에게 너가 RGBA 순서로 픽셀 당 4개의 채널을 제공한다는 것을 말한다.

예를들어 너는 그 데이터를 3개 채널의 RGB로 공급할 수 있고, GL은 자동적으로 이것을 RGBA로 확장할 수 있다 (A를 1로 설정하여), 만약 그 internal format이 RGBA라면. 너는 또한 오직 Red 채널만을 지원할 수 있다.

반대로, 만약 너가 GL_RED를 internalFormat으로 사용한다면, 그 GL은 GBA채널을 너의 입력 데이터에서 무시할 것읻자.

또한 data types가 변경될 것이라는 것에 주목해라. 만약 너가 채널당 32 bit float를 가진 pixel RGB를 제공한다면, 너는 GL_FLOAT를 사용할 수 있다. 그러나, 너가 여전히 GL_RGBA internal format을 사용할 때, 그 GL은 이러한 것을 채널 당 8비트를 가진 표준화된 정수로 변환할 것이다. 그래서 그 추가 precision은 잃어진다. 만약 너가 GL이 부동 소수점 정확도를 사용하길 원한다면, 너는 또한 GL_RGBA32F 같은 floating point texture format을 사용해야만 한다.

_INTEGER formats은 표준화 되지 않은 integer textures이다. GL에서 정수 텍스쳐에 대한 어떠한 자동 변환은 없다. 너는 integer internal format을 사용해야만 하고, 그리고 너는 너의 pixel data를 어떤 _INTEGER format으로 명시해야만 한다. 그렇지 않으면 그것은 에러를 발생시킬 것이다.

댓글 없음:

댓글 쓰기