나는 그 차이점을 이해할 수 없다. TMU는 GPU의 텍스처 매핑 단위이며, OpenGL에서 많은 텍스처 단위를 가질 수 있음을 알고 있습니다. 나는 그들이 동일한 TM이라고 생각 했었습니다. TMU가 있으면 GL_TEXTURE를 사용할 수 있지만 나는 이것이 사실이 아닐 수도 있다는 것을 발견했다. 최근에 말리 400MP GPU를 사용하여 플랫폼을 목표로하는 안드로이드 게임을 작업 중이었습니다. 문서에 따르면, TMU가 하나뿐이므로 한 번에 하나의 텍스처 만 사용할 수 있다고 생각했습니다.하지만 놀랍게도, 문제없이 적어도 네 텍스처. 왜 이래요? 하드웨어 나 드라이버 레벨이 자동으로 다른 텍스처를 스왑하거나 바꾸는 것과 같은 기능을합니까? 그렇다면 캐시 미스가 많이 발생합니까?TMU와 OpenGL의 GL_TEXTUREn의 차이점은 무엇입니까?
답변
저는 특히 말리가 아닌 최고의 하드웨어 아키텍처 전문가는 아닙니다. 하지만 내 이해를 바탕으로 어쨌든 기회를 줄 것입니다.
TMU는 텍스처 샘플링을위한 하드웨어 단위입니다. 영구적으로 OpenGL 텍스처 단위에 할당되지 않습니다. 셰이더가 텍스처 샘플링 작업을 실행할 때마다이 특정 작업을 TMU 중 하나에 할당해야합니다. 그런 다음 TMU는 요청 된 샘플링을 수행하고 결과를 쉐이더에 전달하며 다음 샘플링 작업에 사용할 수 있습니다.
따라서 TMU 수와 지원되는 OpenGL 텍스처 단위 수 사이에는 아무런 관련이 없습니다. 지원할 수있는 OpenGL 텍스처 단위의 수는 하드웨어의 상태 추적 부분에 의해 결정됩니다.
TMU의 수는 성능에 영향을 미칩니다. 더 많은 TMU가 사용 가능할수록, 주어진 시간 내에 더 많은 텍스처 샘플링 동작이 실행될 수있다. 따라서 쉐이더에서 많은 텍스처 샘플링을 사용하면 코드가 더 많은 TMU를 갖게 됨으로써 이익을 얻을 수 있습니다. 같은 텍스처 또는 여러 텍스처에서 여러 번 샘플링하는 것은 중요하지 않습니다.
텍스처 맵핑 단위 (TMU)는 하드웨어의 기능 단위이며 한 번에 픽셀 파이프 라인 수와 직접 관련이 있습니다. 하드웨어가 훨씬 더 추상적이거나 일반적인 목적이므로 이제는 단일 패스에서 얼마나 많은 텍스처가 더 이상 적용될 수 있는지에 대한 좋은 척도가 아닙니다. 전체 멀티 텍스처 성능을 나타낼 수 있지만 그 자체로는 어떤 제한도 부과하지 않습니다.
OpenGL의 GL_TEXTURE0+n
은 실제로 텍스처를 바인딩하는 위치 인 텍스처 이미지 단위 (TIU)를 나타냅니다. 동시에 적용 할 수있는 텍스처의 수 (셰이더의 단일 실행시)는 셰이더 단계마다 다릅니다. GL 4.4에서 5 단계가있는 데스크톱 GL에서 구현은 스테이지 당 16 개의 독특한 텍스처를 지원해야합니다. 이것이 Texture Image Units의 수가 80 (16x5) 인 이유입니다. GL 3.3에는 3 단계 만 있으며 최소 TIU 수는 48입니다. 이렇게하면 GLSL 프로그램의 모든 단계에서 16 개의 고유 한 텍스처 세트를 제공 할 수있는 충분한 바인딩 위치가 제공됩니다.
GL ES, 특히 2.0은 완전히 다른 이야기입니다. 프래그먼트 쉐이더 단계에서 적어도 동시 텍스처 지원과 버텍스 쉐이더에서 (선택 사항)의 지원이 필요합니다.
const mediump int gl_MaxVertexTextureImageUnits = 0; // Vertex Shader Limit
const mediump int gl_MaxTextureImageUnits = 8; // Fragment Shader Limit
const mediump int gl_MaxCombinedTextureImageUnits = 8; // Total Limit for Entire Program
이 당신이 당신의 프로그램 (gl_MaxCombinedTextureImageUnits
)의 단일 실행에 쉐이더 모두에 적용 할 수 텍스처의 수에 제한도 있으며,이 제한은 일반적으로 한계의 단지 합계입니다 각 단계마다.