2016-11-29 8 views
1

Как я понимаю, мы храним текстуру в памяти GPU с помощью функции glTexImage2D и теоретически нет ограниченного числа. Однако, когда мы пытаемся их использовать, существует ограничение, составляющее 32 текстурных элемента GL_TEXTURE0 до GL_TEXTURE31. Почему это ограничение?Почему количество единиц текстуры ограничено в OpenGL?

+1

Традиционно каждый блок текстур может применять операцию над фрагментом. Это означало, что для поддержания скорости заполнения пикселей может применяться только так много единиц; и эти единицы текстуры заняли кремниевую недвижимость, боролись за память текстур и т. д. (здесь я упрощаю). Что еще более важно, тот факт, что 0 .. 31 перечислены, не означает, что они существуют в вашей реализации GL. Вы запрашиваете их с помощью функций 'glGet', например,' GL_MAX_TEXTURE_SIZE', 'GL_MAX_TEXTURE_IMAGE_UNITS'. –

+0

Возможно, вас заинтересует [* GLview *] (http://www.realtech-vr.com/glview/), который может сообщать о реальных возможностях, ограничениях, расширениях и т. Д. Посредством запросов. –

+0

'ARB_bindless_texture' поддерживает доступ к любому количеству текстур, не привязывая их вообще, к оборудованию, которое его поддерживает. – ybungalobill

ответ

1

Указанное ограничение (как указано в комментариях, является неправильным лимитом) относится к числу текстур, которые могут использоваться с одной командой рендеринга за один раз. На каждой стадии шейдера есть its own limit on the number of textures it can access.

Это ограничение существует, поскольку аппаратное обеспечение не ограничено в своих возможностях. Текстуры требуют ресурсов, а некоторые аппаратные средства имеют ограничения на то, сколько из этих ресурсов можно будет использовать сразу. Точно так же, как аппаратное обеспечение имеет ограничения на количество форм, которые может иметь этап шейдера, и так далее.

Теперь есть некоторое оборудование, которое способно получить доступ к данным текстуры более низкоуровневым способом. Эта функция отображается через ARB_bindless_texture. Это не основная функция, потому что не все последние аппаратные средства, совместимые с GL 4.x, могут ее поддерживать.