Я пытался реализовать гистограмму для изображения с помощью webgl. Я могу сделать это в javascript HTML5 Canvas, взяв массив длиной 255 и увеличив значения пикселей каждого индекса до 0-255 и используя createLinearGradient для создания гистограммы.
for(var c = 0; c < 256; c++){
histogram[c] = 0;
}
var ctx = document.getElementById('canvas').getContext('2d');
var pixels= ctx.getImageData(0, 0, width, height).data;
for (var i = 0, j = 0; i < u8a.length; i++, j = j + 4) {
histogram[pixels[j]]++; //increasing pixel index for histogram
}
А для реализации того же в WebGL я имею в виду этот jsfiddle, но я вижу гистограмму не гладкий и не упорядоченный.
Итак, я застрял здесь с двумя вещами с WebGL:
-Как мы можем отсортировать значения пикселей от 0,0 (0) до 1,0 (255) в вышеупомянутой скрипке?
-Как сделать гистограмму гладкой в webgl с/без линейного градиента?
Код :
precision mediump float;
uniform sampler2D u_histTexture;
uniform vec2 u_resolution;
uniform sampler2D u_maxTexture;
void main() {
// get the max color constants
vec4 maxColor = texture2D(u_maxTexture, vec2(0));
// compute our current UV position
vec2 uv = gl_FragCoord.xy / u_resolution;
// Get the history for this color
// (note: since u_histTexture is 256x1 uv.y is irrelevant
vec4 hist = texture2D(u_histTexture, uv);
// scale by maxColor so scaled goes from 0 to 1 with 1 = maxColor
vec4 scaled = hist / maxColor;
// 1 > maxColor, 0 otherwise
vec4 color = step(uv.yyyy, scaled);
float rr = 0.2989 * color.r + 0.5870 * color.g + 0.1140 * color.b;
gl_FragColor = vec4(rr, rr, rr, 1);
}
gl_FragColor = vec4(rr, rr, rr, 1.0) * vec4(uv.xxx,1.0);
, она умножит цвет на позицию x (0-1). Что касается сортировки, все еще неясно, что вы имеете в виду. - person Blindman67   schedule 20.11.2018