Каковы плюсы и минусы HLSL против GLSL против cg? [закрыто]

Каковы плюсы и минусы трех?

56 голосов | спросил Z_guy 2 +04002010-10-02T00:25:51+04:00312010bEurope/MoscowSat, 02 Oct 2010 00:25:51 +0400 2010, 00:25:51

6 ответов


39

coderanger прав в отношении HLSL-таргетинга DirectX, GLSL-таргетинг на OpenGL и CG доступен с обоими интерфейсами.

Однако есть и другие вещи, которые следует учитывать (узнал на форуме OGRE):

  • CG не позволит вам использовать последние функции GLSL (я не уверен в HLSL). Это средняя площадка, поэтому вы не сможете полностью использовать функции GLSL, только общие, пока Shader Model 3.0 (AFAI не понял).
  • CG создана NVidia, которая оптимизирует ее для своей карты, но, похоже, не делает много работы для карт ATI ... некоторые люди сообщают, что могут возникнуть проблемы с картами ATI с использованием CG.
  • OpenGL выглядит немного медленнее, чем DirectX на платформах Windows. Это действительно относительно того, что вы делаете, и причина этого заключается в том, что он является источником реализации драйверов, но хорошо знать, прежде чем выбирать API и соответствующий шейдерный язык. Однако OpenGL - это единственный интерфейс, доступный на всех платформах (win /mac /unix /some console). Поэтому зная, что использование исключительно GLSL может быть лучшим выбором для не-Microsft-ориентированной кросс-платформенной игры.
  • Драйверы NVidia в Linux, похоже, более стабильны, чем драйверы ATI, что делает CG более интересным, если вам нужно быть уверенным, что он отлично работает на Linux (вот все сообщенные данные, вам нужно будет проверить подробности).

Итак, если вы не используете самые последние функции шейдера, CG кажется хорошим выбором. GLSL кажутся одним из лучших, если вы собираетесь работать с OpenGL. HLSL, если вы собираетесь работать исключительно на платформах Microsoft.

Теперь сначала разработка HLSL для Windows для использования DirectX, а затем конвертирование в GLSL для Linux и Mac может стать лучшим решением для обеспечения производительности и иметь более широкий набор доступных шейдерных функций. Это может быть, однако, много работы (не делал этого сам, поэтому я не могу сказать). Графический движок OGRE (и другие двигатели) позволяет использовать любой API (DirectX или OpenGL или другие), чтобы он помог, но есть еще шейдерный код для преобразования, если вы идете этим путем.

Вот и вся информация, которую я собрал, выбирая язык шейдера (еще не принял мое решение).


Обновление: Valve сделал конверсию одной из своих игр в OpenGL и не нашел способ сделать версию DirectX быстрее, чем версия OGL . Поэтому имейте в виду, что состояние реализации драйвера, качество API и т. Д. Все это слишком сильно меняет каждый год, чтобы вы полностью полагались на сырую производительность в качестве аргумента для выбора того или другого. Имея это в виду, выберите OpenGL /GLSL, чтобы упростить свою жизнь при работе (или иметь планы или надежды на работу) с другими платформами, чем Windows, использовать DirectX /HLSL, если вы действительно хотите использовать только платформы Microsoft и сосредоточиться и, возможно, API быстрее, чем OpenGL (теперь это вспять, поэтому не рассчитывайте на него); используйте CG, если вы хотите предоставить обе возможности пользователю, но если у вас есть рабочая сила (и инструменты) для этого, использование GLSL и HLSL также может быть жизнеспособным решением.


Обновление (2012): Важно отметить, что CG был прекращен и больше не поддерживается или активно работает Nvidia. Nvidia рекомендует всем пользователям перейти на комбинацию GLSL и HLSL или более новую библиотеку, такую ​​как nvFX (в github). Это связано с тем, что слишком сложно поддерживать совместимость между GLSL и HLSL.

ответил Klaim 6 +04002010-10-06T14:11:28+04:00312010bEurope/MoscowWed, 06 Oct 2010 14:11:28 +0400 2010, 14:11:28
15

Я могу говорить только о CG vs HLSL, потому что это те, которые я использовал до сих пор.

Cg not совпадает с HLSL.

В Cg NVIDIA отлично справилась с созданием синтаксиса очень чистого шейдера. Его очень похоже на HLSL.

Но , связанный вместе с D3D9 /D3D11 (код инициализации, код компиляции шейдера) гораздо более чистый на HLSL, чем Cg. -1 Cg. Cg имеет неприятный бит кода запуска, который вам даже не нужно иметь для HLSL над D3D.

В Cg вам нужно «cgGetNamedParameter» для каждой равномерной переменной шейдера, которую вы хотите установить /изменить. И вы должны сохранить ссылку CGparameter в своем коде для этой переменной

  //Код C ++ для взаимодействия с переменной шейдера Cg (независимо от языка шейдера)
CGparameter mvp = cgGetNamedParameter (vs, "modelViewProj");
CG :: getLastError («Получение параметра ModelViewProj»); //проверять наличие ошибок
cgSetMatrixParameterdr (mvp, ModelViewProj._11); //установка значений матрицы
 

В HLSL это становится намного чище - всего одна строка, и вам не нужно поддерживать эту переменную CGparameter .

  //Код D3D9 C ++ для взаимодействия с шейдерной переменной HLSL
DX_CHECK (id3dxEffect-> SetMatrix ("modelViewProj", & amp; mvp._11), "Set matrix");
 

В приведенном выше примере DX_CHECK - это просто простая функция, которая проверяет HRESULT, который возвращается из вызова SetMatrix . Приведенный выше код - d3d9 . D3D10 и 11, конечно, намного более болезненны (поскольку объект ID3DX11Effect отсутствует).

Прежде чем я начал использовать HLSL, я использовал этот код и фактически получал ревнивый .

Несмотря на то, что NVIDIA сделала все возможное, чтобы создать общий интерфейс для Cg между OpenGL /D3D, практически говоря с его not , и у вас есть cgGL * , cgD3D9 , cgD3D10 , cgD3D11 , с которыми можно бороться. Так что все работает для OpenGL и D3D !! . Вам все равно придется объединить все в группы типов OpenGL /D3D #ifdef , чтобы они работали на разных платформах. -2 Кг.

Кроме того, у меня недавно был плохой опыт с картами Cg /ATI, которые Я уверен, что не мой плохой. (Кто-нибудь еще попробует?). Я думаю, это может быть так, что NVIDIA не полностью тестирует карты ATI, как утверждает Кэйдж. Или что ATI не тестирует на Cg. Так или иначе, там есть несоответствие и какой-то конфликт интересов. -3 Кг.

В целом я предпочла Cg. Его синтаксис шейдерного кода - чистый, сладкий и аккуратный. Слишком плохо он получил эти другие проблемы.

ответил bobobobo 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 21 Sep 2011 21:21:44 +0400 2011, 21:21:44
9

Мое основное понимание заключается в том, что HLSL предназначен только для DirectX, а GLSL - только для OpenGL. Cg - это в основном тот же язык, что и HLSL, но может использоваться как с DirectX, так и с OpenGL (хотя через другой код времени выполнения).

ответил coderanger 2 +04002010-10-02T01:04:27+04:00312010bEurope/MoscowSat, 02 Oct 2010 01:04:27 +0400 2010, 01:04:27
8

Еще одно существенное различие между HLSL и GLSL (я не знаю, CG, поэтому я не могу говорить за него) заключается в том, что с HLSL Microsoft предоставляет шейдерный компилятор как часть времени выполнения D3D, тогда как с GLSL ваш поставщик оборудования предоставляет это как часть их драйвера.

У этого есть преимущества и недостатки с обеих сторон.

С помощью метода GLSL поставщик может настроить компилятор на возможности своего оборудования. Они знают свое собственное оборудование лучше всего, они знают, что делать и что не делать. С другой стороны, недостатком является то, что в мире, где есть несколько поставщиков оборудования, у вас есть ситуация, где могут быть несогласованности между компиляторами шейдеров, и у продавца также есть полное свободное владение, чтобы испортить.

С помощью метода HLSL Microsoft управляет компилятором. Каждый находится на постоянной технической базе, и если шейдер успешно компилируется в одном месте, то его можно разумно собирать повсюду. Тот же шейдер будет производить один и тот же скомпилированный вывод независимо от поставщика (при прочих равных условиях). С другой стороны, компилятор HLSL должен быть «работает последовательно во всем», поэтому он не может вытащить какие-либо специальные специальные трюки, чтобы получить последние несколько капель сока из резервуара.

Если это произойдет, как будто я предпочитаю представление HLSL о мире, это потому, что я это делаю. Меня сильно укусили дико непоследовательным поведением на разных платформах, и в одном случае даже в итоге пришлось загружать загрузку GLSL обратно в ARB ASM, чтобы получить базовую линию, которая сработала. Компилятор GLSL от NVIDIA можно рассматривать как особенно печально известный - он даже примет синтаксис HLSL и ключевые слова, а это означает, что если вы не будете осторожны, вы можете создать шейдеры, которые будут работать только на NVIDIA и больше ничего. Это джунгли.

ответил Maximus Minimus 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 22 Sep 2011 01:11:40 +0400 2011, 01:11:40
1

Я использую оба, я начал с glsl и перешел в hlsl только потому, что проект требует этого. Учитывая выбор, это glsl полностью. glsl чувствует себя очень гладким, и hlsl чувствует, что он вышел из хоккейной скамьи инженера.

ответил user24721 3 Jam1000000amThu, 03 Jan 2013 09:27:06 +040013 2013, 09:27:06
1

Возможно, вы захотите изучить RTSS (Run Time Shader System), который поставляется вместе с Ogre. Это довольно ново, но вы в основном пишете шейдеры в коде, а не в внешних файлах. Я еще не реализовал его, но определенно планирую использовать его, когда придет время.

Вот огромная серия учебников по вики Ogre, а также для написания шейдеров. http://www.ogre3d.org/tikiwiki/JaJDoo+Shader+Guide

Что касается вашего первоначального вопроса, как сказал Претор, это не вопрос плюсов и минусов, это вопрос того, какую систему рендеринга вы хотите использовать. Поскольку использование DX /OpenGL с Ogre - это всего лишь вопрос загрузки плагина, вы, скорее всего, захотите использовать формат .cg.

ответил Aidan Knight 3 +04002010-10-03T01:03:51+04:00312010bEurope/MoscowSun, 03 Oct 2010 01:03:51 +0400 2010, 01:03:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132