2015-01-08 3 views
3

Недавно у меня были некоторые проблемы с версиями шейдеров GLSL на разных компьютерах. Я знаю, что каждый GPU может иметь разную поддержку шейдеров, но я не знаю, как сделать один шейдер, который будет работать на всех графических процессорах. Если я пишу некоторые шейдеры на своем ПК (GPU - AMD HD7770), мне даже не нужно указывать версию, но на некоторых старых ПК или на PS с nVidia GPU это более строгое для версии, поэтому я должен указать версию, которую поддерживает GPU.OpenGL GLSL версии шейдеров

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

Кто-нибудь знает, как мне написать шейдер, чтобы он мог работать на всех GPU?

+0

Шейдер, который работает на всех графических процессорах и, возможно, во всех версиях драйверов ... Удачи вам в этом! – dari

+0

И как игры могут достичь этого? Я знаю, что это возможно, так почему вы думаете, что это не так? – ProXicT

+0

Какую версию OpenGL вы используете? –

ответ

4

Написание портативного кода OpenGL не так просто, как вам может понравиться.

  1. nVidia драйверы разрешительные. Вы можете уйти со многими вещами на драйверах nVidia, которых вы не можете избежать в других системах.

  2. Легко использовать дополнительные функции. Например, я написал программу, ориентирующуюся на профиль 3.2-core, но использовал GL_INT_2_10_10_10_REV в виде вершинного формата. Символ GL_INT_2_10_10_10_REV определен в 3.2, но он не допускается в виде вершинного формата до 3,3, и вы не получите сообщений об ошибках для его использования случайно.

  3. Многие люди запускают старые драйверы. Согласно опросу Steam, в 2013 году 38% клиентов с драйверами OpenGL 3.x не имели поддержки 3,3, хотя аппаратное обеспечение, поддерживающее 3.0, должно поддерживать 3,3.

  4. Вам всегда нужно будет испытать. Это неудачная реальность.

Мои рекомендации:

  • Всегда нацелены на основной профиль.

  • Всегда указывайте версию шейдерного языка.

  • Проверьте версию драйвера и прервите ее, если она слишком старая.

  • Если вы можете, используйте заголовки/привязки OpenGL, которые отображают только символы в таргетинге версии.

  • Получите копию спецификации для целевой версии и используйте ее как ссылку вместо man-страниц OpenGL.

  • Напишите свой код, чтобы он мог работать на OpenGL ES, если это возможно.

  • Испытание на различные системы. Один ПК, вероятно, не собирается его вырезать. Если вы можете выкопать второй компьютер с помощью графической карты у другого поставщика (не забудьте интегрированную графику Intel), это будет лучше. Вероятно, вы можете получить OpenGL 3.x на пару сотен долларов, или если вы хотите сэкономить деньги, попросите использовать компьютер друга для быстрого тестирования. Вы также можете купить вторую видеокарту (подумайте о цене ниже 40 долларов за низкоуровневую карту с поддержкой OpenGL 4.x), просто будьте осторожны при их замене.

Основная причина, по которой коммерческие игры работают на различных системах, заключается в том, что они имеют бюджет QA. Если вы можете позволить себе команду QA, сделайте это! Если у вас нет команды QA, вам придется делать как QA, так и разработку - две рабочие места - это больше работы, но это цена, которую вы платите за устранение ошибок.

+0

Это именно тот ответ, который я искал, большое спасибо! Я не думал, что это легко, но я подумал, что возможно, я был бы счастлив, если бы смог достичь совместимости для версии openGL> 3.0 :) – ProXicT

+0

@ProXicT: Я бы не стал беспокоиться о OpenGL 3.0, так как контексты OpenGL 3.2 не являются требуется для поддержки любой версии GLSL раньше, чем 1.40. Например, если вы нацеливаете 3.0 (и GLSL 1.30), то вы не можете работать в OS X! Я думаю, что было бы лучше либо нацелиться на 3,2 ядра, либо полностью вернуться к 2.1 и забыть о VAO. –

+0

Итак, все, что мне нужно указать, это '#version 330' и оптимизировать его для этой версии? – ProXicT

Смежные вопросы