Я рисую точки webgl на карте, и в настоящее время все работает нормально. Теперь я хочу добавить на карту еще один слой. Я пытаюсь найти лучший способ сделать это. Из-за того, как написан мой код, я отправляю функции рисования gl один длинный массив в следующем формате:
[lat, lng, r, g, b, a, id, lat, lng, r, g, b, a, id, etc...] //where id is used for selecting the marker.
Точки нарисованы с использованием:
this.delegate.gl.drawArrays(this.delegate.gl.POINTS, 0, numPoints);
При добавлении дополнительного слоя я хочу, чтобы один слой отображался как круги, а другой как квадраты. Моя идея заключалась в том, чтобы добавить еще один элемент в массив, который кодирует, рисовать ли круг или квадрат, то есть 0 или 1, чтобы шаг массива теперь был восемь:
[lat, lng, r, g, b, a, id, code, lat, lng, r, g, b, a, id, code etc...]
Код шейдера затем решает, нарисовать ли круг или квадрат. Это возможно? Я не знаю, как передать шейдеру атрибут кода формы, чтобы определить, какую форму рисовать. Вот код шейдера, в настоящее время существует две программы шейдера фрагментов. Один dr aws круги, один рисовать квадраты.
<script id="vshader" type="x-shader/x-vertex">
uniform mat4 u_matrix;
attribute vec4 a_vertex;
attribute float a_pointSize;
attribute vec4 a_color;
varying vec4 v_color;
void main() {
gl_PointSize = a_pointSize;
gl_Position = u_matrix * a_vertex;
v_color = a_color;
}
</script>
<script id="fshader" type="x-shader/x-fragment">
precision mediump float;
varying vec4 v_color;
void main() {
float border = 0.05;
float radius = 0.5;
vec2 m = gl_PointCoord.xy - vec2(0.5, 0.5);
float dist = radius - sqrt(m.x * m.x + m.y * m.y);
float t = 0.0;
if (dist > border)
t = 1.0;
else if (dist > 0.0)
t = dist / border;
gl_FragColor = mix(vec4(0), v_color, t);
}
</script>
<script id="fshader-square" type="x-shader/x-fragment">
precision mediump float;
varying vec4 v_color;
void main() {
gl_FragColor = v_color;
}
</script>
Мои указатели атрибутов настроены следующим образом:
this.gl.vertexAttribPointer(vertLoc, 2, this.gl.FLOAT, false, fsize*7, 0);
// вершина
this.gl.vertexAttribPointer(colorLoc, 4, this.gl.FLOAT, true, fsize*7, fsize*2);
/ / цвет