В новых версиях директа (начиная с 10-го) появилась такая концепция как feature levels, облегчающая поддержку устаревшего и не очень устаревшего железа. То есть теперь поддержка видеокартой определенного FL гарантирует некий минимальный набор фич и можно не страдать параноей, проверяя каждый отдельный параметр на предмет того, что программа в него влезет.
Кто пользовался данной фичей? С какими подводными камнями сталкивались? Правильно ли я понимаю, что поддержка определенного FL допускает, что отдельные параметры могут превышать значения определенные в данном FL? То есть конкретная видеокарта может например поддерживать текстуры больше чем 2к несмотря на заявленный D3D_FEATURE_LEVEL_9_1?
Еще меня смущает отсутствие третьих шейдеров: в 9-х FL поддерживаются только вторые, а в 10-х уже четвертые. Можно ли скормить 11-му директу третий шейдер? Какой таргет при этом использовать?
Я что-то слышал про feature levels, но никогда не использовал.
Использую D3D9, третьи шейдеры и кое-какие недоки, в принципе для нужд Волатилы хватает. Шейдеры пишу на Cg, в разные таргеты компилирует он сам. Есть и собранные таргеты под DX11, которые можно будет в будущем подключить к DX11-рендеру, если мне будет совсем нечего делать и я начну очередную амелиорацию движка.
Попробуй собрать таргеты vs_3_0 и ps_3_0 и скормить их директу, это точно рабочие профили девятых иксов.
Цитата:
Government-Man писал: можно не страдать параноей, проверяя каждый отдельный параметр на предмет того, что программа в него влезет.
Это зависит от философии разработки.
Есть философия минимального набора фич, который составляет целостную картину мира, в которой функционирует движок. А есть философия "используем то, что есть, и в любом порядке", когда движок умеет постоянно переключаться между разными подходами (или рендерпатчами, если угодно) в зависимости от подлежащего железа. Во втором случае проверка капсов - это не параноя, а совершенно рабочий механизм.
Government-Man писал: облегчающая поддержку устаревшего и не очень устаревшего железа
Особого смысла всё это не имеет, ведь D3D11 не заведётся на XP, где есть старое железо, а поставить дышатку на такое устаревшее железо едва ли получится.
Government-Man мне отчего-то кажется, что надо абстрагироваться версией API на нормальном уровне, а не искать в новых API пути совместимости. Совместимость она или есть, или её нет. А это полумеры.
Как впечатления по сравнению с гл кстати? Если я правильно помню, они положительные?
Цитата:
XaeroX писал: Попробуй собрать таргеты vs_3_0 и ps_3_0 и скормить их директу
Да, я так и думал сделать. Но пока что я влезаю в vs_4_0_level_9_1 и ps_4_0_level_9_1 (это типа вторые шейдеры но с семантиками из четвертых). Если повезет, то их хватит.
Ну он депрекейтед и дисконтинуед, но то что есть, вполне работает. Но таргеты DX11 - это максимум. DX12 уже не поддерживается, как и вулкан.
А што, Cg уже убрали из Юнити?
Цитата:
Government-Man писал: Как впечатления по сравнению с гл кстати? Если я правильно помню, они положительные?
В целом - те же яйца, только в профиль.
Но легче дебажить и лучше документация, как мне показалось.
Government-Man писал: Так это ж хорошо - если обновлений не выходит, значит у тебя всегда последняя версия, а все ее баги гордо именуются особенностями.
Да, это важный плюс. Но с другой стороны, есть страх однажды напороться на фатальный баг, который уже некому фиксить.
Цитата:
Government-Man писал: А ты вулкан с дх12 еще не ковырял?
Ещё нет. У меня руки до DX11 и GLES2+-рендеров пока не дошли. Я в последние три года вообще очень мало графикой занимаюсь, много других задач.
Цитата:
Дядя Миша писал: ну чёб не плодить сущности.
Если ты делаешь проект для программистов - то да, чем меньше сущностей в движке, тем проще и понятнее код. А вот игрокам плевать, какая там гремучая смесь условий и веток, лишь бы на их компах игра работала. Нужно искать золотую середину, кмк.
В шейдерах как известно есть ограничение на количество сэмплеров - обычно их 16. В версиях шейдров до 4-й текстуры биндились непосредственно к сэмплерам, а вот начиная с 4-й версии сэмплер и текстура это разные сущности - сэмплеров (правильнее теперь - сэмплер-стейтов) так и осталось 16, а вот текстур стало можно пихать дофигища.
В ps_4_0_level_9_1, насколько я понял, новое поведение эмулируется: в коде шейдера текстура и сэмплер - разные сущности, однако в реале для каждой пары сэмплер-текстура используется отдельный регистр.
И вот тут есть странность. Раз в SM2.0 есть 16 сэмплеров, то логично предположить, что на них можно забиндить 16 текстур. Однако таблица с описанием совместимости апи дает следующие ограничения:
Для ID3D11DeviceContext::PSSetSamplers: No more than 16 samplers can be bound
Для ID3D11DeviceContext::PSSetShaderResources: No more than 8 simultaneously bound shader resources
То есть сэмплер-стейтов можно забиндить 16, а текстур - всего 8!
А теперь внимание вопрос: уважаемые знатоки старого железа, с чем может быть связано такое ограничение? Связано ли оно с тем, что существовало большое количество железа, на котором количество уникальных текстур было ограничено 8-ю, несмотря на наличие 16-ти сэмплеров?.. Минута на обсуждение...
Government-Man писал: То есть сэмплер-стейтов можно забиндить 16, а текстур - всего 8!
Можно забиндить 16 текстур, но текстурных координат передать не более 8.
Вернее, если я правильно понимаю, в ps_3_0 можно передать не более 10 input registers, которые включают вообще всё. Ну обычно это по семантике POSITION, COLOR и 8 TEXCOORD-регистров. Т.к. шейдер может делать dependent texture reads, то вполне можно засэмплить в нём 16 текстур.
XaeroX
Ну тогда получается, что это какое-то дурацкое искусственное ограничение для вторых шейдеров на 11-м директе. Ведь никто вроде не запрещает использовать одни и те же текстурные координаты для разных текстур?
Еще из ограничений - написано что общее число констант для VS и PS не должно превышать 256 и 32 соответственно. Если это правда, то получается, что на SM2.0 в дх-11 можно использовать только флоат-константы, а булы и инты - нельзя...
Разумеется для моих текущих целей этого всего пока хватает за глаза и я вряд ли упрусь в эти ограничения. Но в целом у меня пока создается впечатление, что максимум из DX9-железа при помощи DX11 не выжать, так что тем кто к этому стремится, логичнее использовать девятый директ.