Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL着色器-使用Frei-Chen边缘检测器进行边缘检测_Opengl_Glsl_Shader - Fatal编程技术网

OpenGL着色器-使用Frei-Chen边缘检测器进行边缘检测

OpenGL着色器-使用Frei-Chen边缘检测器进行边缘检测,opengl,glsl,shader,Opengl,Glsl,Shader,我尝试创建一个着色器,将所有边都绘制为黑色,正如您可能从中了解的那样。我在谷歌上搜索了很多关于如何创建黑色轮廓的文章和源代码。不幸的是,我不了解其中的大多数: 我发现这是一个关于边缘渲染的功能,并尝试了它。不幸的是,只有轮廓是黑色的,而不是网格中的边缘。同样的道理也适用于其他国家 然后我找到了一篇关于Frei Chen边缘检测器的文章,但我不知道整个过程是如何工作的,即使在研究了很长一段时间的描述之后 有人能给我一些帮助如何编程这样一个着色器吗 编辑:我不为网格使用纹理 由于太不具体,我得到

我尝试创建一个着色器,将所有边都绘制为黑色,正如您可能从中了解的那样。我在谷歌上搜索了很多关于如何创建黑色轮廓的文章和源代码。不幸的是,我不了解其中的大多数:

  • 我发现这是一个关于边缘渲染的功能,并尝试了它。不幸的是,只有轮廓是黑色的,而不是网格中的边缘。同样的道理也适用于其他国家
  • 然后我找到了一篇关于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));