Когда я искал метод определения границ WebGL,
я увидел, что у Unity есть решение. Используйте Camera-DepthNormalTexture.shader для записи данных глубины и нормалей в текстуру.
Я воспользуюсь оператором Робертса, чтобы вычислить, являются ли полученные данные ребром,
но WebGL я могу получить depthTexture только в фреймбуфере,
не могу получить depthNormalTexture как в единстве,
Я попытался написать тест в WebGL,
использует только текстуру глубины, полученную в буфере кадра,
, но обнаруживает только края с огромной разницей глубины,
и Невозможно обнаружить все края цветовой модели solid.
Я хочу знать, есть ли другие способы решить эту проблему.
(solid цвет) Тестовый рендеринг WebGL pi c
Я заранее установил нормальные данные вершины
Используя шейдер, указанный в ответе gman, получить текстуру данных нормалей в фреймбуфере в новом рендеринге. Результат, кажется, рисует края, но глубина кажется неправильной
framebuffer = gl.createFramebuffer();
// rgb texture
gl.bindTexture(state.gl.TEXTURE_2D, texture);
// ... texImage2D texParameteri set up
// depth texture
gl.bindTexture(state.gl.TEXTURE_2D, depthTexture);
// ... texImage2D texParameteri set up
// Create a with normals data FBO
normalFramebuffer = gl.createFramebuffer();
gl.bindTexture(gl.TEXTURE_2D, normalTexture);
// ... texImage2D texParameteri set up
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
obj.render('rgbaData shader');
gl.bindFramebuffer(gl.FRAMEBUFFER, normalFramebuffer);
obj.render('normalsData shader');
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
gl.useProgram('my edge detection shader');
gl.uniform1i(texture, 0);
gl.uniform1i(depthTexture, 1);
gl.uniform1i(normalTexture, 2);
мой шейдер обнаружения краев
uniform sampler2D texture;
uniform sampler2D depthTexture;
uniform sampler2D normalTexture;
новый край рендеринга pi c с глубиной и нормалями данные