2017-12-07 32 views
0

2D 텍스처에는 두 좌표 x와 y가 있습니다. 2D 배열을 1D 메모리에 저장하려면 [x + y * width]와 [x * height + y]의 두 가지 형식이 가능합니다. OpenGL에는 여러 가지 혼란스러운 행 메이저/열 주요 규칙이 있으므로 두 가지 형식 중 어느 것이 사용되는지 확실하지 않습니다. 이는 텍스처가 스프라이트 시트 나 아틀라스와 같이 여러 이미지를 저장하는 데 사용되는 경우 이미지의 각 부분을 서로 가깝게 배치하여 메모리에 저장하는 것이 좋습니다. 예를 들어, 형식이 [x + y * width]이고 매우 넓은 텍스처를 사용하는 경우 GPU는 필요한 텍셀을 찾기 위해 메모리의 긴 부분을 건너 뛰어야합니다.OpenGL의 높이 텍스처와 메모리 지역의 넓은 텍스처 비교

따라서 : 넓은 텍스처 아틀라스보다 우수한 높이의 텍스처 아틀라스입니까, 아니면 그 반대입니까? 아니면 GPU에 메모리 지역 혜택이 없습니까?

+2

"OpenGL에는 여러 가지 혼란스러운 행/열 주요 규칙이 있으므로 두 가지 형식 중 어느 것이 사용되는지 확신 할 수 없습니다." "1) 행렬 저장은 텍스처 저장과 관련이 없습니다. 2) OpenGL은 하나의 행렬 규칙 만 가지고 있습니다. 3) 특히 혼란스럽지 않습니다. –

답변

2

텍스처 아트라스의 가장 중요한 측면은 얼마나 많은 이미지가 내부에 들어갈 수 있는지입니다. 텍스처 지도체에 대해서조차도 먼 거리의 텍셀보다 인접한 텍셀에 훨씬 더 접근 할 수 있습니다.

생각해보십시오. 2 개의 32x32 스프라이트를 렌더링한다고합시다. 따라서 한 번의 렌더링 호출로 2 쿼드입니다. 각 쿼드는 화면에서 32x32 픽셀을 차지합니다. 그것은 1024 픽셀입니다.

지역 문제; 1024 개의 로컬에 인접한 텍셀을 렌더링 한 다음, 1024 개의 로컬로 인접한 텍셀의 다른 세트에서 렌더링합니다.

어쨌든 OpenGL은 GPU의 이미지 형식에 대한 세부 정보를 제공하지 않습니다. 특정 크기의 텍셀 및 여러 채널을 요청할 수 있습니다. 하지만 그보다 더 자세한 것은 없습니다. 귀하가 제공 한 데이터는 드라이버에 의해 실제 내부 GPU 데이터로 적절하게 변환됩니다.

일반적으로 GPU는 메모리의 텍스처를 바꿀 것입니다. 이것은 지역성이 보존되도록 데이터를 재 배열하는 것을 의미합니다. 즉, x + y * width 또는 x * height + y으로 텍셀을 저장하는 대신, 더 복잡한 배열로 저장됩니다.

예를 들어 처음 4 개의 값은 0,0; 0,1; 1,0; 및 1,1. 따라서 2x2 블록의 텍셀은 하나의 인접한 메모리 배열에 저장됩니다. 저것은 짜임새 저장이 작동하는 방법의보기이다.

그러나 이것은 모두 구현 세부 사항입니다. Vulkan과 같은 저수준 API조차도 미리 swizzled 텍셀 데이터를 직접로드 할 수 없습니다.