OpenGL着色器-使用Frei-Chen边缘检测器进行边缘检测
我尝试创建一个着色器,将所有边都绘制为黑色,正如您可能从中了解的那样。我在谷歌上搜索了很多关于如何创建黑色轮廓的文章和源代码。不幸的是,我不了解其中的大多数:OpenGL着色器-使用Frei-Chen边缘检测器进行边缘检测,opengl,glsl,shader,Opengl,Glsl,Shader,我尝试创建一个着色器,将所有边都绘制为黑色,正如您可能从中了解的那样。我在谷歌上搜索了很多关于如何创建黑色轮廓的文章和源代码。不幸的是,我不了解其中的大多数: 我发现这是一个关于边缘渲染的功能,并尝试了它。不幸的是,只有轮廓是黑色的,而不是网格中的边缘。同样的道理也适用于其他国家 然后我找到了一篇关于Frei Chen边缘检测器的文章,但我不知道整个过程是如何工作的,即使在研究了很长一段时间的描述之后 有人能给我一些帮助如何编程这样一个着色器吗 编辑:我不为网格使用纹理 由于太不具体,我得到
- 我发现这是一个关于边缘渲染的功能,并尝试了它。不幸的是,只有轮廓是黑色的,而不是网格中的边缘。同样的道理也适用于其他国家
- 然后我找到了一篇关于Frei Chen边缘检测器的文章,但我不知道整个过程是如何工作的,即使在研究了很长一段时间的描述之后李>
由于sqrt(M/S)将单个浮点值返回给vec4(),是否应该工作?谢谢 如果您阅读GLSL规范,将讨论这一点。使用单个标量构造一个
vec4
构造一个vec4
,每个组件都设置为标量
5.4.2向量和矩阵构造函数
构造函数可用于从一组标量、向量或矩阵创建向量或矩阵。这包括缩短向量的能力
如果向量构造函数只有一个标量参数,则它用于将构造向量的所有组件初始化为该标量的值
我说不出这有多有用。跨图像的多个通道复制数据是对内存带宽的巨大浪费…“跨图像的多个通道复制数据是对内存带宽的巨大浪费…”片段着色器输出始终是4元素向量,即使他们最终绑定到的图像具有更少的通道。@Nicolas:
gl_FragDepth
是一个标量片段着色器输出,所以我很难相信这一点。我的观点是,如果着色器显式编写的是vec4
,则OP很可能使用的是4分量图像格式。与其显式地写入和读取相同的数据,不如快速旋转单个组件。这假设着色器知道其写入的图像格式。没有理由必须这样做。当然没有,但是编写着色器的人可能知道格式,并且可能受益于读取和写入单个标量,而不是使用标量vec4
构造函数重载方便地复制它。OP不得不问这个构造器是如何工作的,我建议他们问问自己,这是否是这里想要的/必要的行为。一般来说,我对图像格式或应用程序一无所知,这就是我“不能说”的原因
#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));
}
color = vec4(sqrt(M/S));