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