OpenGL Shader - обнаружение краев с детектором краев Frei-Chen

Я попытался создать шейдер, который окрашивает все края в черный цвет, как вы, возможно, знаете из затенения cel. Я много гуглил и нашел много статей и исходного кода, как создавать черные контуры. К сожалению, я не понимаю большинство из них:

  • Я нашел эту статью о рендеринге рёбер и попробовал вот так. К сожалению, только черный силуэт, но не края, которые лежат в сетке. То же самое относится к этой статье.
  • Затем я нашел эту статью о детекторе краев Frei-Chen, но я понятия не имею, как все это работает, даже после долгого изучения этого описания.

Может ли кто-нибудь помочь мне, как запрограммировать такой шейдер?

РЕДАКТИРОВАТЬ: я не использую текстуры для моих сеток.

Поскольку я получил несколько отрицательных оценок за то, что они слишком неопределенные, я хочу обратиться к детектору краев Frei-Chen. Вот фрагмент кода шейдера из Rastergrid:

#version 330 core

uniform sampler2D image;

out vec4 color;

void main(void)
 {
mat3 I;
float cnv[9];
vec3 sample;

/* fetch the 3x3 neighbourhood and use the RGB vector's length as intensity value */
for (int i=0; i<3; i++)
for (int j=0; j<3; j++) {
    sample = texelFetch( image, ivec2(gl_FragCoord) + ivec2(i-1,j-1), 0 ).rgb;
    I[i][j] = length(sample); 
}

/* calculate the convolution values for all the masks */
for (int i=0; i<9; i++) {
    float dp3 = dot(G[i][0], I[0]) + dot(G[i][1], I[1]) + dot(G[i][2], I[2]);
    cnv[i] = dp3 * dp3; 
}

float M = (cnv[0] + cnv[1]) + (cnv[2] + cnv[3]);
float S = (cnv[4] + cnv[5]) + (cnv[6] + cnv[7]) + (cnv[8] + M); 

color = vec4(sqrt(M/S));
}

Я пропустил матрицу G[9], так как это слишком взорвало бы код. Так что я был бы очень благодарен, если бы кто-то мог сказать мне, как назначение

    color = vec4(sqrt(M/S));

должно работать, так как sqrt(M/S) возвращает одиночное значение с плавающей точкой в ​​vec4()? Спасибо!

1 ответ

Решение

Это обсуждается, если вы читаете спецификацию GLSL. Строительство vec4 используя одну скалярную конструкцию vec4 с каждым компонентом, установленным в скаляр.

5.4.2. Векторные и матричные конструкторы

Конструкторы могут использоваться для создания векторов или матриц из набора скаляров, векторов или матриц. Это включает в себя способность сокращать векторы.

Если в конструкторе вектора есть единственный скалярный параметр, он используется для инициализации всех компонентов построенного вектора значением этого скаляра

Насколько это полезно, я не могу сказать. Дублирование данных по нескольким каналам изображения - большая трата пропускной способности памяти...

Другие вопросы по тегам