Я знаю одну вагому причину віддавати перевагу чіткому визначенню місця розташування.
Вважайте, що ви зберігаєте дані геометрії в об’єктах масиву Vertex. Для даного об’єкта ви створюєте VAO таким чином, щоб індекси відповідали, наприклад:
- індекс 0 : позиції,
- індекс 1 : норми,
- індекс 2 : текстові слова
Тепер подумайте, що ви хочете намалювати один об’єкт двома різними шейдерами . Один шейдер вимагає як вхідних даних положення та звичайні дані , інший - положення та текстурні координати .
Якщо ви скомпілюєте ці шейдери, ви помітите, що перший шейдер очікує позицій з індексом атрибутів 0 і нормалей на 1. Інший очікує позицій на 0, але текстурні координати на 1.
Цитування https://www.opengl.org/wiki/Vertex_Shader :
Автоматичне призначення
Якщо жоден із попередніх двох методів не призначає вхідні дані індексу атрибутів, тоді індекс автоматично призначається OpenGL, коли програма пов’язана. Присвоєний індекс є абсолютно довільним і може бути різним для різних зв'язаних програм, навіть якщо вони використовують однаковий код вершинного шейдера.
Це означає, що ви не зможете використовувати свій VAO з обома шейдерами. Замість того, щоб мати один VAO на, скажімо, об’єкт, вам знадобиться - у гіршому випадку - окремий VAO на об’єкт на шейдер .
Примушуючи шейдери використовувати власну конвенцію про нумерацію атрибутів, glBindAttribLocation
можна легко вирішити цю проблему - все, що вам потрібно зробити, це підтримувати послідовне відношення між атрибутами та їхніми ідентифікованими ідентифікаторами та змусити шейдери використовувати цю умову під час зв’язку.
(Це насправді не є великою проблемою, якщо ви не використовуєте окремі VAO, але все одно можете зробити свій код зрозумілішим.)
ДО:
Налаштовуючи розташування атрибутів для програми шейдерів OpenGL, у вас є два варіанти
У OpenGL / GLSL 3.3 є третій варіант: вкажіть місце безпосередньо в коді шейдера . Це виглядає так:
layout(location=0) in vec4 position;
Але цього немає в мові шейдерів GLSL ES.
glBindAttribLocation
свій графічний движок, який чудово працював на Linux. Коли я переносив у вікна, він використовував мої нормалі як вершини - я повинен був чітко вказати йому порядок змінних у моєму шейдері,glBindAttribLocation
щоб він працював ...