Я пробовал некоторые WebGL, но есть ошибка, которую я не могу найти, как исправить.
В настоящее время у меня есть следующая установка: у меня есть около 100 треугольников, все из которых имеют позицию и рисуются одной функцией gl.drawArrays
. Чтобы отрисовать их в правильном порядке, я использовал gl.enable(gl.DEPTH_TEST);
, что дало правильный результат.
Проблема, с которой я столкнулся сейчас, заключается в том, что если я обновлю gl_Position
треугольников в вершинном шейдере, обновленное значение Z не будет использоваться в тесте глубины. В результате треугольник с gl_Position.z
из 1 можно нарисовать поверх треугольника с gl_Position.z
из 10, а это не совсем то, что мне нужно.
Что я пробовал?
gl.enable(gl.DEPTH_TEST);
gl.depthFunc(gl.GEQUAL);
с
gl.clear(gl.DEPTH_BUFFER_BIT);
gl.clearDepth(0);
gl.drawArrays(gl.TRIANGLES, 0, verticesCount);
в функции рендеринга.
Для создания буфера используется следующий код:
gl.bindBuffer(gl.ARRAY_BUFFER, dataBuffer);
gl.bufferData(gl.ARRAY_BUFFER, positionBufferData, gl.STATIC_DRAW);
const positionLocation = gl.getAttribLocation(program, 'position');
gl.enableVertexAttribArray(positionLocation);
gl.vertexAttribPointer(positionLocation, 3, gl.FLOAT, false, false, 0, 0);
Треугольники с более высоким значением z намного больше по размеру (из-за перспективы), но маленькие треугольники все еще появляются над ними (из-за порядка рендеринга).
В фрагментном шейдере я использовал gl_fragCoord.z
, чтобы убедиться, что это правильно, и меньшие треугольники (дальше) получили более высокую альфу, чем большие (ближе).
Что может быть причиной странного поведения при рисовании?
gl.GEQUAL
тогда, хороший момент. Тест глубины по-прежнему не работает на моем обновленномgl_Position
. - person Alter User   schedule 08.04.2017