Вершинный шейдер WebGL / GLSL объединяет 9 точек в одну точку, когда я устанавливаю x координат gl_Position на ноль - PullRequest
1 голос
/ 17 сентября 2010

Я не понимаю, почему следующие два шейдера дают разные результаты, когда я визуализирую буфер вершин с координатами x, равными нулю:

Первый:

attribute vec3 position;

void main() {
  gl_Position = vec4(position.x, position.y, 0.0, 1.0);
}

Второй:

attribute vec3 position;

void main() {
  gl_Position = vec4(0.0, position.y, 0.0, 1.0);
}

Результатом первого является линия из девяти точек.Результат второй - одна точка.

Я рисую следующий массив вершин как GL_POINTS:

0.0, -1.00, 0.0,
0.0, -0.75, 0.0,
0.0, -0.50, 0.0,
0.0, -0.25, 0.0,
0.0,  0.00, 0.0,
0.0,  0.25, 0.0,
0.0,  0.50, 0.0,
0.0,  0.75, 0.0,
0.0,  1.00, 0.0

Вот вызовы подготовки VBO:

var a = new Float32Array([
    0.0, -1.00, 0.0,
    0.0, -0.75, 0.0,
    0.0, -0.50, 0.0,
    0.0, -0.25, 0.0,
    0.0,  0.00, 0.0,
    0.0,  0.25, 0.0,
    0.0,  0.50, 0.0,
    0.0,  0.75, 0.0,
    0.0,  1.00, 0.0
]);
gl.bindBuffer(gl.ARRAY_BUFFER, b);
gl.bufferData(gl.ARRAY_BUFFER, a.byteLength, gl.STATIC_DRAW);
gl.bufferSubData(gl.ARRAY_BUFFER, 0, a);

Вот розыгрыши:

gl.bindBuffer(gl.ARRAY_BUFFER, b);
gl.vertexAttribPointer(p.position, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(p.position);
gl.drawArrays(gl.POINTS, 0, 9);

1 Ответ

1 голос
/ 08 февраля 2011

Это известная проблема (извините, пока нет ссылки).

По сути, компилятор GLSL считает, что атрибут 'position' не используется, поскольку его первый компонент не используется.Чтобы проверить это, попробуйте следующий тест:

gl_Position = vec4(0.0, position.y, 0.0, 1.0) + position.x*0.001;

Как только вы подтвердите ошибку, вы можете либо обновить свой видеодрайвер, либо использовать очевидный обходной путь.

...