GL_MAX_TEXTURE_IMAGE_UNITS_ARB и GL_MAX_TEXTURE_COORDS_ARB
Как, всем известно, в FFP режиме текстурных юнитов не может быть более 4.
На данный момент функционал FFP, насколько я знаю, не является аппаратным, а полностью эмулируется. И там просто оставили 4 юнита.
При использовании Cg или GLSL у нас другая картина - там мы опираемся на
GL_MAX_TEXTURE_IMAGE_UNITS_ARB и GL_MAX_TEXTURE_COORDS_ARB.
У меня на GeForce9800GT первый равен 32, а второй - 8.
Первый - это кол-во текстурных юнитов, второй - кол-во текстурных координат. Засада заключается в том, что если я использую более 8 текстурных юнитов, OpenGL выдает GL_ENVALID_ENUM.
Т.е. можно подумать, что он опирается на меньшее значение, хотя, к примеру я текстурных координат использую максимум две штуки, да и те через атрибуты, а не через текскорды.
Почитал вот эту темку: http://www.gamedev.ru/code/forum/?id=32907
где, кстати отметился наш старый знакомец Берсеркер и выяснил такую любопытную вещь:
Цитата:
Если по спецификациям DX,то количество реальных/эмулируемых самплеров:
ps1.1-1.3 -4шт
ps1.4 -6
ps2.0 -8
ps3.0 -16
Правда там написано по спецификациям DX, но что если это и в OGL канает тоже?
Кто что об этом знает?
Дядя Миша писал: Как, всем известно, в FFP режиме текстурных юнитов не может быть более 4.
32 лимит, аппаратно - зависит от железки, смотри GL_MAX_TEXTURE_UNITS_ARB. У радеонов с пс1.4 там реально шестёрка возвращается.
Цитата:
Дядя Миша писал: Кто что об этом знает?
Кто делал волатилу, которая работает на всех мыслимых версиях пиксельных шейдеров - тот и знает.
Ну и берсеркер ещё.
Добавлено 05-05-2014 в 00:59:
Цитата:
Дядя Миша писал: У меня на GeForce9800GT первый равен 32, а второй - 8.
Ну вот, лимит 8 текстур у тебя.
Это ещё фигня, гораздо забавнее, когда драйвер рапортует поддержку vertex texture fetch, a num_vertex_texture_blablabla_arb равно 0. И такое бывает.
не-не, я разобрался. Всё дело в вызове
glClientActiveTextureARB
если её не вызывать, то ошибка исчезает.
В принципе я давно заметил, что её перестали вызывать, следовательно она нужна только для FFP.
Добавлено 04-05-2014 в 22:07:
А вот, собственно и подтверждение:
Цитата:
glActiveTextureARB selects which texture unit subsequent texture state
calls will affect. The number of texture units an implementation sup-supports
ports is implementation dependent, but must be at least 2.
Vertex arrays are client-side GL resources, which are selected by the
glClientActiveTextureARB routine.
glClientActiveTextureARB selects the vertex array client state parame-parameters
ters to be modified by glTexCoordPointer, and enabled or disabled with
glEnableClientState or glDisableClientState, respectively, when called
with a parameter of GL_TEXTURE_COORD_ARRAY.
то есть идея такая - биндить текстуры надо через glActiveTexture, а вот задавать текстурные координаты - через glClientAciveTexture