Почему существует несколько способов передачи VAO в программу GLSL?

Пример кода:

1. glGenBuffers(1, &VboId);
2. glBindBuffer(GL_ARRAY_BUFFER, VboId);
3. glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
4. glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
5. glEnableVertexAttribArray(0);

Таким образом, «0» в строках 4 (первый аргумент) и 5 ​​относится к произвольному идентификатору / местоположению, которое мы выбрали. В GLSL, если мы хотим сослаться на эти данные, нам просто нужно сослаться на тот же идентификатор:

layout(location=0) in vec4 in_Position;

Однако в другом примере программы я видел, что это было сделано по-другому, без ссылки на «расположение макетов». что-то вроде этого:

1. glGenBuffers(1, &VboId);
2. glBindBuffer(GL_ARRAY_BUFFER, VboId);
3. glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
4. glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
5. glBindAttribLocation(shaderProgramHandle, 0, "in_position");
6. glEnableVertexAttribArray(0);

Мы добавили дополнительный шаг (5), где мы, кажется, привязываем этот указатель атрибута к определенной переменной в конкретной программе. А затем в нашем GLSL вместо этого мы просто пишем это:

in vec3 in_position;

Без ссылка на местоположение.

Если я не ошибаюсь, эти две программы, по сути, делают одно и то же ... так в чем разница? Каковы плюсы и минусы каждого метода?

(Я только что начал изучать OpenGL 3.x)

6
задан mpen 14 February 2012 в 01:59
поделиться