Войти
ПрограммированиеФорумВеб

WebGl 2.0 Vertex Array Object (VAO) (2 стр)

Страницы: 1 2
#15
15:37, 14 фев. 2018

Подскажите еще в одном моменте.
Вот часть кода, все работает.

var vertexShaderSource = `#version 300 es
  in vec2 a_position;
  uniform vec2 u_resolution;
  void main() {
    vec2 xy = a_position / u_resolution * 2.0;
    gl_Position = vec4(xy, 0, 1);
  }
`;

...
var positionAttributeLocation = gl.getAttribLocation(program, "a_position");
    
var vbo = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(positionAttributeLocation);
..

Но можно реализовать и вот так:

var vertexShaderSource = `#version 300 es
  layout(location = 0) in vec2 a_position;
  uniform vec2 u_resolution;
  void main() {
    vec2 xy = a_position / u_resolution * 2.0;
    gl_Position = vec4(xy, 0, 1);
  }
`;

...
var positionAttributeLocation = gl.getAttribLocation(program, "a_position");
    
var vbo = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(0);
..

Разница в 3 строчках:

in vec2 a_position;
//
layout(location = 0) in vec2 a_position;
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(positionAttributeLocation);
//
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(0);

и в чем прикол ???


#16
15:43, 14 фев. 2018

Разобрался, второй вариант это как альтернатива var positionAttributeLocation = gl.getAttribLocation(program, "a_position"); (данную строчку можно удалить и не получать атрибут, мы как бы уже задали индекс). А есть ли разница в этих подходах?! например производительность? или это кому как удобно ??? или есть все-таки свои плюсы и минусы.

#17
11:53, 15 фев. 2018

SkyWeb
> А есть ли разница в этих подходах?!

Есть. Во втором случае тебе уже не нужен getAttribLocation, ты уже объяваил привязку в шейдере.

1) getAttribLocation вызывает принудительно сихронизацию.

2) getAttribLocation не позволяет использовать один и тот же vao c разными шейдерами, практически смысл vao исчезает. В случае со статической привязкой если у тебя в обоих шейдерах обьявлены входные аттрибуты с одинаковым типом и одинаковой привязкой, то ты можешь использовать один и тот же vao с обоими этими шейдерами.

#18
12:54, 15 фев. 2018

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

#19
11:05, 16 фев. 2018

SkyWeb
> Читал что также можно сделать и с uniform, но что-то у меня не получилось.

Потому что онли в десктопном опенгл 4.2, в ES 3.0 и WebGL - не поддерживается.

#20
11:06, 16 фев. 2018

nonamezerox понял. Спасибо.

#21
11:30, 16 фев. 2018

nonamezerox
На GL 3.3 прекрасно работает через

#extension GL_ARB_shading_language_420pack : require
За GLES не скажу, но кто мешает попробовать.
#22
11:51, 16 фев. 2018

Dampire

Это опять же для десктопного.

#23
14:46, 16 фев. 2018

nonamezerox
> 2) getAttribLocation не позволяет использовать один и тот же vao c разными
> шейдерами, практически смысл vao исчезает...
Для этого есть bindAttribLocation.

#24
15:07, 16 фев. 2018

Правильно я понял bindAttribLocation это тоже самое что в самом шейдере указать layout (location = 0)

#25
15:20, 16 фев. 2018

SkyWeb
> Правильно я понял bindAttribLocation это тоже самое что в самом шейдере
> указать layout (location = 0)

Да.

Страницы: 1 2
ПрограммированиеФорумВеб

Тема в архиве.