Glsl 正在处理片段着色器,但未显示任何内容

Glsl 正在处理片段着色器,但未显示任何内容,glsl,processing,Glsl,Processing,我似乎有一个问题,让着色器在处理工作。我正在处理墨迹效果,在得到一些帮助来编写着色器的其余部分之后,我似乎什么都做不到。颜色保持黑色,当我更改gl_FragColor=vertColor时;(处理保留颜色),图像变为白色。据我所知,在这种情况下,它应该直接通过,所以现在我相信可能有什么地方出了问题。有人有什么建议吗 编辑:我做了一些更改,试图使其与我在其他处理着色器中看到的更接近。我现在使用的不是vertColor,而是sampler2D(source,coord).rgb,它仍然不起作用 PS

我似乎有一个问题,让着色器在处理工作。我正在处理墨迹效果,在得到一些帮助来编写着色器的其余部分之后,我似乎什么都做不到。颜色保持黑色,当我更改gl_FragColor=vertColor时;(处理保留颜色),图像变为白色。据我所知,在这种情况下,它应该直接通过,所以现在我相信可能有什么地方出了问题。有人有什么建议吗

编辑:我做了一些更改,试图使其与我在其他处理着色器中看到的更接近。我现在使用的不是vertColor,而是sampler2D(source,coord).rgb,它仍然不起作用

PShader shader;
PImage photo;

void setup() {
  size(619,619,P2D);
  photo = loadImage("paintedsky.jpg");
  shader = loadShader("inkspread.glsl");
}

void draw() {
  shader.set("T",(float) millis()/1000.0);
  shader(shader);
  image(photo,619,619);
}

颜色保持黑色,当我更改gl_FragColor=vertColor时;(处理保留colro),图像变为白色

我假设vertColor是被解释为颜色的顶点的位置。在这种情况下,1以上的所有内容都被钳制为1,因此如果顶点位置位于(1,1,1),则颜色为白色。如果顶点位置位于(2,2,2),它将被钳制为(1,1,1),因此颜色再次为白色。
您将使用非白色,其中至少有一个位置值为代码存在两个问题:

1) 在
inkspread.glsl
中,您定义了
uniform sampler2D source
,但从未在着色器上设置此统一。如果要通过此统一将PImage或PGraphics对象传递到着色器中,则必须调用
shader.set(“source”,photo)
,方法与传递
T
的时间相同。但是,处理已经为您提供了免费的纹理。如果在整个着色器文件中将
更改为
纹理
,处理将自动将主图形画布传递到着色器的
均匀采样2D纹理
。变化的
VertexCoord
是另一个特殊属性,处理过程会自动将碎片着色器交给它。还有一些,但我认为它们目前没有很好的记录

2) 第二个问题是image()和shader()调用的顺序。由于着色器旨在对图像进行后处理,因此需要先绘制图像,然后调用着色器在主绘图画布上执行操作。那么一切都应该正常工作。应该是这样的:

void draw() {
    image(photo,619,619);
    shader.set("T",(float) millis()/1000.0);
    shader(shader);
}

我已经测试了这个补丁,一切正常。我不确定想要的效果是什么,但是你的着色器给了我的照片一个很好的变暗/饱和效果。

我通过了浮点计算得到了帮助,我只能假设这些只代表一个颜色通道(所以我应该把它改成vec3或其他颜色)。vertColor的缩放对我来说似乎很奇怪,因为通常vertColor在我见过的其他处理着色器中被视为0-1。我使用sampler2D(source,coord).rgb而不是vertColor进行了更新,这仍然存在相同的问题。尝试使用
verTexCoord.st
而不是计算的
c
值来读取
x
值。在理想情况下,它们无论如何都没有明显的效果,但现在它们可能会出现问题,我不确定glsl的默认设置。也试着不要在gl_FragColor中使用结果,只是为了看看结果是否不是黑屏。你想达到什么样的效果?从上面的代码中,我假设
T
是一个浮点变量。它看起来好像从未给过它一个值。我假设这意味着它要么被初始化为零,要么被当作一个空指针处理——因此,您可能在
F()
函数中产生了被零除的错误或其他错误。我不知道glsl在引擎盖下是怎么工作的。哦,没关系。抱歉,我只是查了一下
uniform
的定义。不用担心,我的客户端程序(处理)正在为T发送一个浮点,这似乎没有问题。我正在查找代码中的明显错误,通常我可以进行计算。请原谅我对glsl的无知,但在第一个代码片段
着色器(shader)
中,它意味着什么?我假设在这种情况下,着色器需要图像等数据。代码似乎正在将对着色器的引用传递给自身。这在某种程度上也是我的一个困惑,但在处理过程中检查其他着色器,这似乎不是一个问题。shader()似乎只是被输入draw()函数中出现的任何数据,除非它被重置/刷新。谢谢!我仍然需要对着色器本身进行一些工作,但这有助于使其实际运行。
void draw() {
    image(photo,619,619);
    shader.set("T",(float) millis()/1000.0);
    shader(shader);
}